gpt4 book ai didi

java - 通过 Futures 实现线程

转载 作者:行者123 更新时间:2023-11-30 05:54:53 25 4
gpt4 key购买 nike

我想知道下面的实现是否正确

    ExecutorService pool = Executors.newFixedThreadPool(MAX_NSH_THREADS);
Set<Future<Void>> futureRequest = new HashSet<Future<Void>>();

for (String host : SomeCollection)) {
Callable<Void> callable = new FileExtractor(j);
Future<Void> future = pool.submit(callable);
futureRequest.add(future);
}

for (Future<Void> future : futureRequest) {
try {
future.get();
} catch (Exception e) {
logger.error(e);
}
}

pool.shutdown();

根据 Javadoc,future.get() 等待每个线程的执行完成,这(据我了解)意味着对于每个 future ,我们将等待接收结果分别地。那么好处从何而来,还是我做得不对?

最佳答案

你做得对。

假设 SomeCollection 包含 100 个项目,FileExtractor 运行需要 5 秒,并且您的 ExecutorService 线程池包含 100 个线程.

如果您按照上面的实现方式开始操作,预计代码将运行大约 5 秒,因为 FileExtractor 可能会受到 I/O 限制。 (假设最大 CPU 效率)。

如果您不使用 Future,并且一切都串行运行,则此代码将运行大约 500 秒。

关键是 Future#get() 等待 Thread 填充结果,方法是将 Callable 提交给ExecutorService,而不是等待 ExecutorService#submit(Callable) 方法。

关于java - 通过 Futures 实现线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com