/*
* $Id$
*
* Copyright (c) 2007 by Joel Uckelman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.tools;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.jdesktop.swingworker.SwingWorker;
/**
*
*
* @since 3.1.0
* @author Joel Uckelman
*/
public class ThreadManager {
private ThreadManager() { }
private static final BlockingQueue<Runnable> requestQueue =
new LinkedBlockingQueue<Runnable>();
/*
new LinkedBlockingQueue<Runnable>() {
@Override
public boolean offer(Runnable r) {
boolean ret = super.offer(r);
if (ret) System.out.println("queued " + r);
else System.out.println("failed to queue " + r);
for (Iterator<Runnable> i = requestQueue.iterator(); i.hasNext(); ) {
System.out.println("in queue: " + i.next());
}
return ret;
}
@Override
public Runnable take() throws InterruptedException {
Runnable r = super.take();
System.out.println("took " + r);
for (Iterator<Runnable> i = requestQueue.iterator(); i.hasNext(); ) {
System.out.println("in queue: " + i.next());
}
return r;
}
@Override
public Runnable poll(long timeout, TimeUnit unit) throws InterruptedException {
Runnable r = super.poll(timeout, unit);
System.out.println("polled " + r);
for (Iterator<Runnable> i = requestQueue.iterator(); i.hasNext(); ) {
System.out.println("in queue: " + i.next());
}
return r;
}
};
*/
/*
private static final BlockingQueue<Runnable> requestQueue =
new PriorityBlockingQueue<Runnable>(20, new PriorityOrdering());
private static final class PriorityOrdering implements Comparator<Runnable> {
public int compare(Runnable x, Runnable y) {
return
(x instanceof Prioritizable ? ((Prioritizable) x).getPriority() : 0) -
(y instanceof Prioritizable ? ((Prioritizable) y).getPriority() : 0);
}
}
*/
private static final class Ex extends ThreadPoolExecutor {
public Ex(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public <V> Future<V> submit(SwingWorker<V,?> req) {
execute(req);
return req;
}
/*
@Override
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return runnable instanceof RunnableFuture ?
(RunnableFuture<T>) runnable : super.newTaskFor(runnable, value);
}
*/
}
// private static final ExecutorService threadPool =
// Executors.newFixedThreadPool(2);
// Executors.newCachedThreadPool();
// new ThreadPoolExecutor(2, 2, 60, TimeUnit.SECONDS, requestQueue);
private static final Ex threadPool =
new Ex(2, 2, 60, TimeUnit.SECONDS, requestQueue);
// FIXME: RunnableFuture does not exist in Java 1.5. Remove this
// once we switch to 1.6.
@SuppressWarnings("unchecked")
public static <V> Future<V> submit(Runnable task) {
//System.out.println("thread queue: " + requestQueue.size());
return (Future<V>) threadPool.submit(task);
}
public static <V> Future<V> submit(SwingWorker<V,?> req) {
return threadPool.submit(req);
}
/*
public static <V> Future<V> submit(RunnableFuture<V> task) {
System.out.println("thread queue: " + requestQueue.size());
return (Future<V>) threadPool.submit(task);
}
*/
}