我用Google搜索了这个,但仍然无法得到充分的理解。我找不到任何使用FutureTask(Runnable runnable, V result)
构造函数
Java doc说
未来提交(Runnable任务, 结果)
提交Runnable任务以执行并返回Future 代表那个任务。 未来的get方法将返回给定的 成功完成后的结果。
看看这个我的理解是在任务完成futureTask.get()它将向我们发回传递的 给定的 结果对象,它与&#无关34;可运行"工作。这是" Runnable"工作完成的信号。
任何具体的用例或任何现实生活中的例子都会非常有用
还要与Enno一起回答它与在循环中使用isdone()的不同之处。
的被修改
为什么不等待通知?
答案 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更清楚你要做的事情。