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.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.limewire.util.ExceptionUtils;
/** An extension to ThreadPoolExecutor that catches unexpected exceptions and reports them. */
class ErrorCatchingThreadPoolExecutor extends ThreadPoolExecutor {
public ErrorCatchingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}
public ErrorCatchingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
public ErrorCatchingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}
public ErrorCatchingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
public <T> Future<T> submit(final Callable<T> task) {
return super.submit(new Callable<T>() {
public T call() throws Exception {
try {
return task.call();
} catch(RuntimeException re) {
ExceptionUtils.reportOrReturn(re);
throw re;
} catch(Error error) {
ExceptionUtils.reportOrReturn(error);
throw error;
}
};
});
}
@Override
public Future<?> submit(final Runnable task) {
return super.submit(new Runnable() {
public void run() {
try {
task.run();
} catch (Throwable t) {
ExceptionUtils.reportOrReturn(t);
ExceptionUtils.rethrow(t);
}
}
});
}
@Override
public <T> Future<T> submit(final Runnable task, T result) {
return super.submit(new Runnable() {
@Override
public void run() {
try {
task.run();
} catch (Throwable t) {
ExceptionUtils.reportOrReturn(t);
ExceptionUtils.rethrow(t);
}
}
}, result);
}
}