当前位置: 首页 > 知识库问答 >
问题:

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

宫弘亮
2023-03-14

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

Java博士说

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

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

看到这一点,我的理解是在任务完成后的未来任务。get(),它将返回传递的给定结果对象,该对象与“可运行”作业无关。这是一种“可运行”作业完成的信号。

任何具体的用例或任何现实生活中的例子都会很有帮助。

此外,结合Enno的答案,它与可能在循环中使用isdone()有何不同。
编辑 另外,为什么不等待通知?

共有2个答案

侯博裕
2023-03-14

例如,您可以这样做:

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(!future task . isdone)//睡眠一段时间////完成后显示文章//

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

高承望
2023-03-14

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

所以你走吧。我只用过一次。它与< code>CompletionService结合使用非常有用,因为这允许任务生成和任务完成分离,但仍然可以通信

 类似资料:
  • 问题内容: 看着它只是说的javadocs 提交要执行的Runnable任务,并返回代表该任务的Future。Future的get方法将在成功完成后返回给定的结果。 参数: 任务-提交的任务 结果-要返回的结果 但是结果如何呢?它在那里存储什么吗?它是否仅使用结果的类型来指定类型? 问题答案: 它对结果没有任何作用-保留它。任务成功完成后,调用将返回您传递的结果。 这是Executors $ Ru

  • 我正在为以下问题而苦苦挣扎:我有一个返回Future[Result]的方法,其中Result是我想用specs2中的数据表行检查的东西。 据我所知,以下代码每次都会阻塞并等待结果可用。 通常,我想异步进行所有调用,然后使用Future.sequence将Seq[Future[Result]]转换为Future[Seq[Result]],然后运行测试。 有什么合理的方法可以做到这一点吗?

  • 我正在为给定的主键查询Dynamo DB。主键由两个UUID字段(fieldUUID1、fieldUUID2)组成。对于上面的主键组合和值列表,我有很多查询要执行。为此,我使用异步CompletableFuture和ExecutorService,线程池大小为4。 在所有查询返回结果之后,这是

  • 我正在尝试将方法的调用/结果链接到下一个调用。我得到了编译时错误方法,因为if无法从前一次调用中获得objB的引用。 如何将上一次调用的结果传递给下一个链?我是不是完全误解了这个过程?

  • 好吧,我想问题已经在标题中完成了。没什么大不了的,但我只是想知道。我有一个返回正确值或错误代码枚举项的方法。例如这样的东西: 其中返回一个Future,而只是修改数据。 现在我已经直观地编写了< code>Future[_],因为返回值是灵活的。但是在查看其他库时,我看到了< code>Future[Any]的用法。当你在函数的返回中使用匹配用例来检查它是什么数据时,这似乎也是合乎逻辑的。 例如,

  • 问题内容: 问题 我已经将一个长期运行的任务划分为多个逻辑子任务,因此我可以在每个子任务完成时报告结果。但是,我正在尝试报告将永远无法完成的任务的结果(而不是不断产生价值),并且正在使用现有的解决方案来做到这一点。 背景 我正在为我编写的某些Python程序构建Web界面。用户可以通过Web表单提交作业,然后返回查看该作业的进度。 假设我有两个函数,每个函数都可以通过单独的形式进行访问: :执行大