我想创建一个具有固定线程池大小的singleton-ExecutorService。另一个线程将给ExecutorService提供Callables,我想在执行完成后立即(优化)解析Callables的结果。
我真的不确定如何正确执行此操作。
我最初的想法是单例ES中的一种方法,该方法通过“ submit(callable)”向ExecutorService添加一个Callable并将其存储在单例内部的HashMap或ArrayList中。另一个线程将检查期货在给定间隔内的结果。
但是以某种方式,这种解决方案并不“感觉正确”,并且我在其他地方都没有找到针对该用例的解决方案,因此我要问你们,在我编写稍后后悔的东西之前。
您将如何解决这个问题?
期待您的回复!
最佳答案
import java.util.concurrent.*;
public class PostProcExecutor extends ThreadPoolExecutor {
// adjust the constructor to your desired threading policy
public PostProcExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new FutureTask<T>(callable) {
@Override
protected void done()
{
if(!isCancelled()) try {
processResult(get());
} catch(InterruptedException ex) {
throw new AssertionError("on complete task", ex);
} catch(ExecutionException ex) {
// no result available
}
}
};
}
protected void processResult(Object o)
{
System.out.println("Result "+o);// do your post-processing here
}
}
关于java - 如何使用ExecutorService管理未知数量的Callables的返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19540997/