取消Java中的期货
假设我有这样的代码(注意我的语法不是100%正确)取消Java中的期货,java,multithreading,Java,Multithreading,假设我有这样的代码(注意我的语法不是100%正确) //这就是我收集期货的方式: int指数=0; for(未来:未来){ 试一试{ 布尔canCancelOtherTasks=future.get(); 如果(canCancelOtherTasks){ 从指数(指数+1,期货)中取消所有期货; 打破 } }捕获(例外e){ //处理异常 打破 } 索引++; } ===== 从指数(指数、期货)中取消所有期货{ for(int k=index;k
//这就是我收集期货的方式:
int指数=0;
for(未来:未来){
试一试{
布尔canCancelOtherTasks=future.get();
如果(canCancelOtherTasks){
从指数(指数+1,期货)中取消所有期货;
打破
}
}捕获(例外e){
//处理异常
打破
}
索引++;
}
=====
从指数(指数、期货)中取消所有期货{
for(int k=index;k
对于一个特定的作业,我基本上需要并行运行N个可调用项,并且我希望在第一个可调用项生成true之后尽早退出,而不必等待列表中的其他可调用项。请注意,列表中的未来已按重要性排序
上述方法有效吗?这是否有效(即,假设每个可调用函数都有一个具有不同运行时的任务,那么它是否有助于我的应用程序的整体运行时)?我本来打算对此进行评论,但它有点冗长,因此我将其作为一个更好的格式的答案 调用
future.get()
会阻塞调用线程,直到计算完成。看
所以这不会起作用,因为它只会等到列表中的第一个未来完成,然后取消所有其他内容。假设列表中有3个期货<代码>未来[0]需要500毫秒,未来[1]
需要50毫秒,未来[2]
需要45毫秒。在当前实现中,它将等待第一个项目future[0]
完成,因为您在循环的第一次迭代中调用future.get()
,这将无限期地等待future返回。它将等待所有500毫秒,尽管future[1]
和future[2]
完成得更快
解决这个问题的一种方法是只在列表中的每个未来等待最短的时间,然后检查下一个未来。这并不完美,因为最坏的情况是,在等待另一个任务时,您将错过第一个完成的未来任务。您必须无限地执行此循环,直到它成功返回,否则,如果在您离开循环之前没有执行任何循环,您可能会错过第一次执行
如果您确实需要尽早停止,我建议您使用。对不起,我应该更清楚,它将等待列表中的第一个未来完成。假设列表中有3个期货<代码>未来[0]需要500毫秒,
未来[1]
需要50毫秒,未来[2]
需要45毫秒。在当前实现中,它将等待第一个项目future[0]
完成,因为您在循环的第一次迭代中调用future.get()
,这将无限期地等待future返回。尽管future[1]
和future[2]
完成得更快,但它将等待所有500毫秒。您可以选择您的答案并添加更多详细信息。我认为这比通过评论来修饰你的答案更可取。说得好@Abra,我不知道为什么我没有这样做。有关详细信息,请立即编辑。请不要破坏该问题,如果要删除该问题,请单击问题标签下的delete
链接。请不要通过破坏您的帖子为其他人做更多工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下不可撤销的权利,以分发该内容(即,无论您未来的选择如何)。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果你想了解更多关于删除帖子的信息,请参阅:这是一个有用的问题。为什么要删除它?
// This is how I am collecting the futures:
int index = 0;
for(Future<Boolean> future : futures) {
try {
Boolean canCancelOtherTasks = future.get();
if (canCancelOtherTasks) {
cancelAllFuturesFromIndex(index + 1, futures);
break;
}
} catch (Exception e) {
// handle exception
break;
}
index++;
}
=====
cancelAllFuturesFromIndex(index, futures) {
for(int k = index; k < futures.size(); k++) {
futures.get(k).cancel(true);
}
}