ExecutorService.invokeAll不支持可运行任务的集合

rai*_*mar 14 java executorservice java.util.concurrent

想通过ExecutorService的 invokeAll(..)方法运行Runnable任务的集合.但是现在不支持(仅支持可调用任务的集合)

有什么具体的原因吗?做类似事情的替代方法是什么.

rai*_*mar 25

Runnable task = new Runnable() { 
     public void run() {

     }
};

Callable<Object> c = Executors.callable(task);
Run Code Online (Sandbox Code Playgroud)

刚刚发现,Executors提供了将Runnable任务转换为Callable任务的实用工具方法.这就解释了为什么我们没有重载带有Runnable任务的invokeAll.


JB *_*zet 14

只需将runnable转换为callables:

List<Callable<Void>> callables = new ArrayList<>();
for (Runnable r : runnables) {
    callables.add(toCallable(r));
}
executor.invokeAll(callables);

private Callable<Void> toCallable(final Runnable runnable) {
    return new Callable<Void>() {
        @Override
        public Void call() {
            runnable.run();
            return null;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 太棒了......这更像是一个黑客.Java有很多API,所以想知道是否有任何特定的原因可以省略这种方法? (5认同)
  • Java 是一套丰富的 hacks* (2认同)