Java 并发:取消 Future 是否有必要让它们被垃圾收集?

2024-01-16

我正在编写一些代码,我可能需要创建无限数量的未来对象(java.util.concurrent.Future)。

但我担心在某些时候内存会耗尽。

这里有几个问题:

  1. jvm 是否知道一旦 future 完成,它就不会在任何地方被引用,因此有资格进行 GC(即使创建它的线程仍然处于活动状态并正在运行)?
  2. 理想情况下,我不想跟踪这些期货本身。但如果我保留这些 future 的引用并定期调用取消它们,这会让它们可用于 GC 吗?

您最终需要删除对Future以便对它们进行垃圾收集。通常的做法是维护一个集合Future并定期检查是否isDone()回报true。如果是这样,则任务已完成并且对其的引用可以被清除。如果您担心堆积一些可能会安全中断的长时间运行的任务,则需要调用cancel() on the Future并删除/清空可能存在的任何对它的引用。

一般来说,构建一个可能经历无限增长的系统总是一个坏主意。如果未偿还的数量Future对象变得太大,您应该在系统的其他地方施加背压。

不一定是“未来一旦完成,就不会在任何地方被引用”。例如,引用它的客户端可以通过以下方式请求结果:get()任意点的方法。因此,JVM 需要保留Future直到所有这些外部引用都被删除为止。当线程池中的引用被删除时Future是“完成”(意味着它完成了任务或被取消)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 并发:取消 Future 是否有必要让它们被垃圾收集? 的相关文章

随机推荐