FutureTask与Runnable和结果

时间:2014-08-14 11:29:05

标签: java multithreading concurrency

我用Google搜索了这个,但仍然无法得到充分的理解。我找不到任何使用FutureTask(Runnable runnable, V result)构造函数

的特定示例

Java doc说

  

未来提交(Runnable任务,                        结果)

     

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

看看这个我的理解是在任务完成futureTask.get()它将向我们发回传递的 给定的 结果对象,它与&#无关34;可运行"工作。这是" Runnable"工作完成的信号。

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

还要与Enno一起回答它与在循环中使用isdone()的不同之处。
被修改 为什么不等待通知?

2 个答案:

答案 0 :(得分:2)

因此,这是来自现实生活中的用例,尽管它可能无法代表标准用法。基本上,我正在调整返回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);
} 

所以你去吧。我曾经只使用过一次。它与CompletionService结合使用很有用,因为它允许任务生成和任务完成分离,但仍然是通信。

答案 1 :(得分:1)

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

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

修改

  

它与`while(!futureTask.isdone)有何不同//有时间睡觉// //完成时显示文章//

这可能是一个不同的问题,但你永远不应该这样做,因为睡眠/检查/睡眠效率低于仅仅调用get,而IMO更清楚你要做的事情。