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

时间:2014-06-06 12:04:08

标签: java executorservice java.util.concurrent

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

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

2 个答案:

答案 0 :(得分:21)

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

     }
};

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

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

答案 1 :(得分:12)

只需将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;
        }
    };
}