Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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_Concurrency - Fatal编程技术网

Java 具有可运行和结果的未来任务

Java 具有可运行和结果的未来任务,java,multithreading,concurrency,Java,Multithreading,Concurrency,我在谷歌上搜索了一下,但仍然无法得到一个坚实的理解。我找不到任何使用FutureTask(Runnable-Runnable,V-result)构造函数的特定示例 Java博士说 未来提交(可运行任务, (T结果) 提交可运行任务以执行,并返回未来 代表那个任务Future的get方法将返回给定的 成功完成后的结果。 从这个角度看,我的理解是在任务完成后futureTask.get()它会将传递的给定的结果对象发送给我们,该对象与“Runnable”作业无关。这是一种“可运行”作业已完成的信号

我在谷歌上搜索了一下,但仍然无法得到一个坚实的理解。我找不到任何使用
FutureTask(Runnable-Runnable,V-result)
构造函数的特定示例

Java博士说

未来提交(可运行任务, (T结果)

提交可运行任务以执行,并返回未来 代表那个任务Future的get方法将返回给定的 成功完成后的结果。

从这个角度看,我的理解是在任务完成后futureTask.get()它会将传递的给定的结果对象发送给我们,该对象与“Runnable”作业无关。这是一种“可运行”作业已完成的信号

任何具体的用例或现实生活中的例子都会非常有用

另外,结合Enno的回答,它与在循环中使用isdone()有何区别。
已编辑
还有,为什么不等待通知呢?

例如,您可以执行以下操作:

Future<Article> article = 
    executor.submit(new PayForArticle(article.articleId), article);

showFunnyVideo();
playAlittleGame();

// ...OK let's actually show the user the article

Article article = article.get();

// The above will block until the article is payed for
// And throws exceptions if it failed
未来文章=
执行人提交(新的支付条款(第条、第条ID)、第条);
showFunnyVideo();
playalitlegame();
//…好的,让我们实际向用户展示这篇文章
Article=Article.get();
//以上内容将被阻止,直到物品付款为止
//并在失败时抛出异常
编辑

它与'while(!futureTask.isdone)//睡眠一段时间////完成后显示文章///有什么不同


这可能是一个不同的问题,但您永远不应该这样做,因为睡眠/检查/睡眠比只调用
get
效率低,而且IMO更清楚您正在尝试做什么。

因此,这是从现实生活中的用例派生出来的,尽管它可能不代表标准用法。基本上,我是在修改返回runnable的现有代码

LocalService manager = ...; // this is not thread safe
CompletionService exec = new ExecutorCompletionService( ... );
List<URL> work = ...;
for( URL url : work ) {
   // this is existing code returning Runnable
   Runnable task = createTaskFor(url);
   exec.submit(task, url);
}
// we will report the URLs in the order they complete
for( int i = 0; i < work.size(); i++) {
   URL completed = exec.take();
   // manager isn't thread safe, so all calls to it are on this thread
   manager.reportCompleted(completed);
} 
LocalService管理器=…;//这不是线程安全的
CompletionService exec=新的ExecutionCompletionService(…);
列出工作=。。。;
用于(URL:工作){
//这是返回Runnable的现有代码
Runnable task=createTaskFor(url);
执行提交(任务、url);
}
//我们将按URL完成的顺序报告URL
对于(int i=0;i

好了。我只用过一次。它与
CompletionService
结合使用非常有用,因为这样可以使任务生成和任务完成分离,但仍然可以通信。

我以前考虑过这一点,现在编辑了这个问题。它与` while(!futureTask.isdone)//睡眠一段时间////完成后显示文章//同意@EnnoShioji有什么不同。但这是主要目的吗?或者你可以想到任何其他用例?我不一定同意清楚的部分:)至少对我来说,发送和接收同一个名为“result”的对象是混乱的,它与特定线程中的计算无关。还有,为什么不等待通知呢?@AbhijitMazumder:Re:wait/notify,这基本上就是它内部的功能。至于它令人困惑,这不是真的,如果你看到它从来电者的视角。调用者所关心的只是在
get
返回后得到它所需要的。如果这个方法是打包未来最简单的方法,那么就可以使用它。调用方不关心使用了什么方法来打包它。一个实用的答案是:当您有一个
Runnable
并且想要一个
FutureTask
Future
,您可以使用这些构造(作为结果传递
null
)将可运行对象“转换”为Future/FutureTask