T T*_*T T 4 java future threadpool 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);
}
Run Code Online (Sandbox Code Playgroud)
基本上,池线程有8个线程,我最终有20个任务(这些只是示例).如果我理解正确的话,它现在的工作方式是它等待所有20个任务完成后再按顺序输出它们(从1到20).该程序应该做的是输出连续的字节流(由线程处理,因为我需要保持顺序完整,我使用了未来的接口).虽然我不介意等到完成所有20个任务,但无论如何都要让线程按顺序输出.
如果没有办法,或者我只是完全误解了invokeAll的工作方式,那么澄清也是受欢迎的.提前谢谢!执行官有点混乱,因为我刚刚了解了它们.
随机附录,我甚至可以从一个可调用的函数返回一个字节数组?
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);
}
}
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6779 次 |
| 最近记录: |