我正在编写一些代码,我可能需要创建一个无限数量的未来对象(java.util.concurrent.Future)。
但我担心某些时候内存不足。
这里有几个问题:
答案 0 :(得分:5)
您最终需要删除对Future
的任何引用,以便对它们进行垃圾回收。通常的做法是维护Future
的集合,并定期检查isDone()
是否返回true
。如果是,则任务已完成,并且可以清除对它的引用。如果您担心堆积一些可能安全中断的长时间运行的任务,您需要同时调用cancel()
上的Future
并删除/清除可能存在的对它的任何引用。
总的来说,构建一个可能经历无限增长的系统始终是一个坏主意。如果未完成的Future
个对象的数量变得太大,您应该在系统的其他位置应用反压力。
不一定是“一旦未来完成,就不会在任何地方被引用”。例如,引用它的客户端可以在任何时候通过get()
方法请求结果。因此,JVM需要保持Future
直播,直到删除所有这些外部引用。当Future
“完成”(意味着它完成了任务或被取消)时,线程池中的引用将被删除。
答案 1 :(得分:0)
您是否看到了this个问题?
一旦完成了Future的计算,您就不能再取消它了。 我不知道确切的上下文,但有一个建议是跟踪期货,取消您想要或需要取消的期货,并在执行人员上调用清除以将其从工作队列中删除。
希望它有所帮助。