Bre*_*nne 6 java asynchronous executorservice futuretask
我有3个FutureTask<T>物体.我希望它们是异步处理的.但是,只要其中一个FutureTasks get()方法没有返回,null我想继续,即我的方法(包装器)返回,并且不等到处理其他两个FutureTasks.我想到了类似的东西:
private File wrapper(final File file) {
ExecutorService executors = Executors.newCachedThreadPool();
File returnFile;
FutureTask<File> normal= ...
FutureTask<File> medium=...
FutureTask<File> huge=...
executors.execute(normal);
executors.execute(medium);
executors.execute(huge);
try {
if((returnFile=normal.get()) != null ||
(returnFile=medium.get()) != null ||
(returnFile=huge.get()) != null)
return returnFile;
} catch(ExecutionException | InterruptedException e) { }
}
Run Code Online (Sandbox Code Playgroud)
我不确定如何以正确的方式捕获异常(由get()抛出),因为我假设它们将被抛出,因为我只是返回而不等待其他两个任务完成.此外,我怀疑代码是否会像预期的那样工作.我觉得我接近解决方案但却遗漏了一些东西.
我可以建议检查 FutureTask::isDone 吗?
那么会是这样的:
while(true) {
if (normal.isDone()) {
return normal.get();
}
if (medium.isDone()) {
return medium.get();
}
if (huge.isDone()) {
return huge.get();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:一旦您手头有一个结果,您就可以取消其他任务。
使用FutureTask::get不是您想要的,因为它很可能总是返回 normal.get() 的结果,因为文档已经指出:
如有必要,等待计算完成,然后检索其结果。
为了澄清上述内容:如果您使用 FutureTask::get,您调用 get 的第一个 FutureTask 很可能会阻塞并等待,直到有结果返回。
编辑2:
将该循环包装到一个新的 Runnable 中,由 ExecutorService 执行,将第一个可用结果传递给另一个方法或实现回调,这样就不再需要忙等待了。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |