如题,需要执行多个子任务然后合并,可以使用 CountDownLatch,然后进行合并,也可以使用 ThreadPoolExecutor.invokeAll(),然后遍历 Future 的 List 然后进行 Future.get()进行合并。两种方法哪种更好,效率如何(个人感觉有效率应该无差,都是 AQS 的实现)。到了饭点,太饿了,原谅我现在做一个伸手党,后续自行研究。
Java 分解任务执行 CountDownLatch 用法和 Future 用法比较
相关帖子
-
从执行效率方面看的话两种方式应该差距不大,因为 invokeAll 也是遍历 Future List 的:
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { if (tasks == null) throw new NullPointerException(); ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); boolean done = false; try { for (Callable<T> t : tasks) { RunnableFuture<T> f = newTaskFor(t); futures.add(f); execute(f); } for (int i = 0, size = futures.size(); i < size; i++) { Future<T> f = futures.get(i); if (!f.isDone()) { try { f.get(); } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } } } done = true; return futures; } finally { if (!done) for (int i = 0, size = futures.size(); i < size; i++) futures.get(i).cancel(true); } }
就像你说的最终都是基于 AQS(AbstractQueuedSynchronizer),不基于具体场景的话我更偏向于使用 invokeAll。
- 其他回帖
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于