【问题标题】:How to know if java.util.concurrent Future Interface is still valid?如何知道 java.util.concurrent 未来接口是否仍然有效?
【发布时间】:2021-03-04 17:28:00
【问题描述】:

在我的应用程序中,我使用“提交(可调用任务)”方法将任务添加到“ScheduledThreadPoolExecutor”。该方法返回一个“未来”,我在另一个线程中评估其结果。但是这个线程运行其他代码,执行“Future.get()”可能需要一段时间。

我发现C++提供了一个“future :: valid”函数来检查“future :: get”返回的值是否仍然有效。但是Java既没有提供方法也没有提供异常来指示“Future.get()”是否不再有效(如果垃圾收集器已经从“ScheduledThreadPoolExecutor”队列中移除了相应的任务)。

建议做什么?我是否应该尝试从读取线程中删除其余任务并使其尽快等待“Future.get()”?

【问题讨论】:

  • 为什么GC会从队列中移除一个任务? “有效”是什么意思?
  • @AndyTurner 我假设 GC 负责从队列中删除已执行的非重复任务。我计划无限期地完成很多任务。那么我应该手动删除已经运行的任务吗?

标签: java future


【解决方案1】:

Java 不是 C++。 Future.get() 是“有效的”,只要您有对所述变量的引用并且不会被垃圾收集器收集。

请注意,如果线程尚未完成执行,Future.get() 将阻塞。如果需要在没有阻塞的情况下检查结果是否就绪,Future 提供了.isDone() 方法。

【讨论】:

  • 我假设垃圾收集器会自动将已执行的非重复任务出列。但是(希望我理解正确)如果我删除任务返回的“Future”引用,GC 会从队列中删除任务吗?我需要无限期地放很多任务,所以我必须以某种方式释放队列。
  • 不,取消对 Future 的引用不会从队列中删除任务——它只会让您无法获得任务的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2012-11-19
相关资源
最近更新 更多