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 不支持可运行任务的集合的主要内容,如果未能解决你的问题,请参考以下文章

ExecutorService - invokeAll 和 invokeAny 使用场景

java并发编程框架 Executor ExecutorService invokeall