Java-使用 invokeAll 按顺序获取 future 结果,但仅适用于某些线程

标签 java threadpool future executors

我...真的不知道如何更好地表达标题。但基本上,我拥有的是一个线程池,所有这些线程都在忙着工作。我希望他们按照分配的顺序报告他们的结果,但与此同时,我想分批工作。为了说明,例如

ExecutorService exec = Executors.newFixedThreadPool(8);

class MyCallable implements Callable<byte[]> {
    private final int threadnumber;

    MyCallable(int threadnumber){
        this.threadnumber = threadnumber;
    }

    public byte[] call() {
        //does something
    }
}
List<Callable<byte[]>> callables = new ArrayList<Callable<byte[]>>();

for(int i=1; i<=20; i++) {
    callables.add(new MyCallable(i));
}
try {
    List<Future<byte[]>> results = exec.invokeAll(callables);
    for(Future<byte[]> result: results) {
            System.out.write(result.get(), 0, result.get().length);
    }

基本上,池线程有 8 个线程,我最终有 20 个任务(这些只是示例)。如果我理解正确的话,它现在的工作方式是等到所有 20 个任务完成后再按顺序输出它们(从 1 到 20)。这个程序应该做的是输出连续的字节流(由线程处理,因为我需要保持顺序不变,所以我使用了 future 的接口(interface))。虽然我不介意等到所有 20 个任务都完成,但有没有办法让线程在运行时按顺序输出。

如果没有办法或者我只是完全误解了 invokeAll 的工作原理,也欢迎澄清。提前致谢! Executors 有点令人困惑,因为我才刚刚了解它们。

随机附录,我什至可以从可调用对象返回字节数组吗?

最佳答案

invokeAll()等到所有结果都计算完才返回。

使用循环和submit()相反,此方法会立即返回一个带有未决结果的 Future:

...
for(int i=1; i<=20; i++) {
    results.add(exec.submit(new MyCallable(i))); 
}
try {
    for(Future<Integer> result: results) {
            System.out.write(result.get(), 0, result.get().length);
    }
}
...

关于Java-使用 invokeAll 按顺序获取 future 结果,但仅适用于某些线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13112336/

相关文章:

Java:在 JTextField 中添加占位符

java - 如何使用JMF录制网络摄像头的视频?

java - mysql.jdbc.driver类未找到异常

Ruby 1.9 线程池

mongodb - 如何在 Scala/ReactiveMongo 中映射两个 `future` 结果?

java - 将 Hibernate 升级到 5.1.0 后如何导出模式?

java - 线程池未创建所需数量的线程

java - 任务 ID 作为线程池中的线程名称

list - 如何在 Flutter 中反转 ListView

java - Spring Repository @Async Future<List<T>> 返回错误类型