ExecutorService.invokeAll 不支持收集可运行任务
2022-09-02 05:11:05
希望通过 ExecutorService 的 invokeAll(..) 方法运行 Runnable 任务的集合。但目前还不支持(仅支持可调用任务的集合))
这有什么具体原因吗?做类似事情的替代方法是什么。
希望通过 ExecutorService 的 invokeAll(..) 方法运行 Runnable 任务的集合。但目前还不支持(仅支持可调用任务的集合))
这有什么具体原因吗?做类似事情的替代方法是什么。
Runnable task = new Runnable() {
public void run() {
}
};
Callable<Object> c = Executors.callable(task);
刚刚发现,Executors提供了实用程序方法将Runnable任务转换为可调用任务。这就解释了为什么我们没有重载的 invokeAll,它也接受 Runnable 任务。
只需将 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;
}
};
}