Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取消Java中的期货_Java_Multithreading - Fatal编程技术网

取消Java中的期货

取消Java中的期货,java,multithreading,Java,Multithreading,假设我有这样的代码(注意我的语法不是100%正确) //这就是我收集期货的方式: int指数=0; for(未来:未来){ 试一试{ 布尔canCancelOtherTasks=future.get(); 如果(canCancelOtherTasks){ 从指数(指数+1,期货)中取消所有期货; 打破 } }捕获(例外e){ //处理异常 打破 } 索引++; } ===== 从指数(指数、期货)中取消所有期货{ for(int k=index;k

假设我有这样的代码(注意我的语法不是100%正确)

//这就是我收集期货的方式:
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);
   } 
}