ExecutorService.invokeAll 不支持可运行任务的集合
Posted
技术标签:
【中文标题】ExecutorService.invokeAll 不支持可运行任务的集合【英文标题】:ExecutorService.invokeAll does NOT support collection of runnable task 【发布时间】:2014-07-27 16:47:15 【问题描述】:想通过ExecutorService 的invokeAll(..) 方法运行Runnable 任务的集合。 但目前不支持(仅支持可调用任务的集合)
有什么具体原因吗?做类似事情的替代方法是什么。
【问题讨论】:
【参考方案1】:只需将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;
;
【讨论】:
太棒了..这更像是一个黑客。 Java 有丰富的 API,所以想知道是否有任何具体原因省略了这个方法? 当我们向 ExecutorService 提供 runnable 时,这就是 Java 在内部所做的事情 Java 是一组丰富的 hacks*【参考方案2】:Runnable task = new Runnable()
public void run()
;
Callable<Object> c = Executors.callable(task);
刚刚发现,Executors 提供了将Runnable 任务转换为Callable 任务的实用方法。这就解释了为什么我们没有重载 invokeAll,它也需要 Runnable 任务。
【讨论】:
以上是关于ExecutorService.invokeAll 不支持可运行任务的集合的主要内容,如果未能解决你的问题,请参考以下文章