我想知道下面的实现是否正确
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/