希望通过ExecutorService的invokeAll(..)方法运行Runnable任务的集合。 但是现在不支持(仅支持可调用任务的集合)
有什么具体原因吗?做类似事情的替代方案是什么。
答案 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;
}
};
}