【问题标题】:How to confirm Future returns value as soon as it has one如何确认 Future 一有返回值
【发布时间】:2016-07-21 12:39:20
【问题描述】:

请有人建议在这种情况下如何使用 Callable 和 Future

我希望能够为来自不同用户的项目提交多个投标。

我正在开始一个新线程,当中标值返回时,我想返回该值。我如何产生一个新线程并在我有一个值时立即返回一个值。将 Future.get() 作为下一行等待返回值还是返回空值?

public AuctionBid getWinningBid(String itemCode){
    Callable<AuctionBid> winningBidCallable = () -> store.getWinningBid(itemCode);
    Future<AuctionBid> future = executorService.submit(winningBidCallable);
     return Future.get(); // can this return empty object
}

【问题讨论】:

  • 您查看过Future.get() 方法的Javadoc 文档吗?它说“如果需要,等待计算完成,然后检索其结果。”。您对此有疑问吗?
  • "can this return empty object" 你说的“空对象”是什么意思?它可以返回您可以存储在 AuctionBid 引用中的任何内容,包括 null、一些缓存实例或新创建的实例。
  • 你会想要使用某种回调机制。
  • @HovercraftFullOfEels Future 接口是否不需要某种回调?我的意思是,OP 可以只返回 Future
  • 既然 OP 提到他想提交多个投标,我假设他想等到所有列表/一组期货都有结果,然后返回最佳结果。如果是这种情况,那么 OP 应该看看这个问题:stackoverflow.com/questions/19348248/…

标签: java multithreading


【解决方案1】:

Future.get() 是一个阻塞调用,所以它会一直等到 Future 有任何值(前提是没有异常)。 所以在你的情况下,Future.get() 可以满足你的要求。

【讨论】:

  • 他的代码没有满足任何有用的要求,因为他创建了一个线程并立即用 get 调用阻塞了当前线程。
  • @Hovercraft Full Of Eels - 这是我不清楚如何进一步进行的地方。我的商店有来自不同用户的商品的出价。给定一个项目代码,我想返回该项目的中标。同时我希望它是多线程的。任何建议,我该如何处理?正如您在此处正确指出的那样,Future 的使用无助于产生多个可以返回值的线程。
  • @Kar:Erwin Bolwidt 已经为您提供了一个可能对您有帮助的链接——CompletionService。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多