Java 通过期货实现线程

Java 通过期货实现线程,java,multithreading,future,Java,Multithreading,Future,我想知道下面的实现是否正确 ExecutorService pool = Executors.newFixedThreadPool(MAX_NSH_THREADS); Set<Future<Void>> futureRequest = new HashSet<Future<Void>>(); for (String host : SomeCollection)) { Callable<Void>

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

    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();
ExecutorService pool=Executors.newFixedThreadPool(最大线程数);
Set futureRequest=new HashSet();
for(字符串主机:SomeCollection)){
Callable Callable=新文件提取器(j);
Future=pool.submit(可调用);
futureRequest.add(未来);
}
for(未来:未来请求){
试一试{
future.get();
}捕获(例外e){
错误(e);
}
}
pool.shutdown();

根据Javadoc,
future.get()
等待每个线程的执行完成,这(据我所知)意味着对于未来的每个线程,我们将分别等待接收结果。这样做的好处在哪里?还是我做得不对?

你做得对

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

如果您按照上面实现的方式启动,那么代码将运行大约5秒钟,因为
FileExtractor
可能是I/O绑定的。(假设CPU效率最高)

如果您没有使用
Future
,并且所有内容都是连续运行的,那么此代码将运行大约500秒


关键是
Future#get()
等待结果被
线程填充,该线程是通过将
Callable
提交到
ExecutorService
来启动的,而不是等待
ExecutorService#submit(Callable)
方法来启动的。

每个Future都是在提交后立即启动的,通过调用
pool.submit
。如果您的主线程在此期间还有其他工作要做(在开始期货和等待期货结束之间),那么很容易发生的情况是,当您到达第二个循环时,所有期货都已完成,因此实际上不会出现阻塞


如果
get
方法确实阻塞了主线程,而您正在等待第一个
Future
完成,请注意其他方法仍在并行运行(至少在给定足够的处理器时间的情况下是潜在的)。

您试图获得什么好处?这似乎是可行的,但是的,它只需等待所有期货交易完成,然后关闭该池。。。