Java并发:取消他们收集垃圾所需的期货?

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

但我担心某些时候内存不足。

这里有几个问题:

  1. jvm是否知道,一旦未来完成,它就不会在任何地方被引用,因此有资格获得GC(即使创建它的线程仍在运行并运行)?
  2. 理想情况下,我不想自己跟踪这些未来。 但是,如果我确实保留这些期货的参考并定期对它们取消取消,那么它们是否可用于GC?

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

一般而言,构建一个可能经历无限增长的系统始终是一个坏主意。 如果未完成的Future对象的数量变得太大,您应该在系统的其他位置应用反压。

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

你看过这个问题吗?

完成Future的计算后,您将无法再取消它。 我不知道确切的上下文,但有一个建议是跟踪期货,取消您想要或需要取消的期货,并在执行程序上调用清除以将其从工作队列中删除。

希望能帮助到你。