package org.limewire.concurrent;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import org.limewire.listener.EventListener;
/**
* A ThreadPoolExecutor that creates a {@link ListeningFuture} instead of
* {@link Future} for submitted events.
*
* This allows an {@link EventListener} of {@link FutureEvent} to be added to
* the Futures with {@link ListeningFuture#addFutureListener(EventListener)}.
*/
public class ThreadPoolListeningExecutor extends ErrorCatchingThreadPoolExecutor implements
ListeningExecutorService {
public ThreadPoolListeningExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}
public ThreadPoolListeningExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
public ThreadPoolListeningExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}
public ThreadPoolListeningExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
protected <T> RunnableListeningFuture<T> newTaskFor(Callable<T> callable) {
return new ListeningFutureTask<T>(callable);
}
@Override
protected <T> RunnableListeningFuture<T> newTaskFor(Runnable runnable, T value) {
return new ListeningFutureTask<T>(runnable, value);
}
@Override
public <T> ListeningFuture<T> submit(Callable<T> task) {
return (ListeningFuture<T>)super.submit(task);
}
@Override
public ListeningFuture<?> submit(Runnable task) {
return (ListeningFuture<?>)super.submit(task);
}
@Override
public <T> ListeningFuture<T> submit(Runnable task, T result) {
return (ListeningFuture<T>)super.submit(task, result);
}
}