我想创建一个具有固定线程池大小的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/

10-11 14:29