java - 通过 Futures 实现线程

标签 java multithreading future

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

    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/

相关文章:

java - C# 中的 readInt16() 与 java 中的 readShort()

java - 如何从文本文件中挑选出单独的数字?

java - 来自 json 或 xml 字符串的对象构造函数

java - Clojure - 如何将 DirectByteBuffer(由 getChannel.map 返回)转换为 MappedByteBuffer?

java - 修改线程内的父类变量

scala - 测试依赖于 future 的 AKKA Actor

java - 预定的 future 会导致内存泄漏吗?

java - 在 Java 中制作偶数和奇数线程以自然顺序打印数字

c# - 什么决定了 TaskFactory 产生的作业的线程数?

Java CompletableFuture.allOf() 找不到任何数组元素