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

希望通过 ExecutorService 的 invokeAll(..) 方法运行 Runnable 任务的集合。但目前还不支持(仅支持可调用任务的集合))

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


答案 1
Runnable task = new Runnable() { 
     public void run() {

     }
};

Callable<Object> c = Executors.callable(task);

刚刚发现,Executors提供了实用程序方法将Runnable任务转换为可调用任务。这就解释了为什么我们没有重载的 invokeAll,它也接受 Runnable 任务。


答案 2

只需将 runnables 转换为 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;
        }
    };
}

推荐