我在我的现实生活中遇到了这个问题,并通过我的测试代码和分析器进行了验证。我不是粘贴“tl; dr”代码,而是向您展示一张图片然后描述它。 关于Future.firstCompletedOf和垃圾收集机制
简单地说,我使用Future.firstCompletedOf
摆脱2个Future
S,这两者有没有共同的东西,不关心对方的结果。即使这是我想要解决的问题,垃圾收集器无法回收第一个对象Result
,直到Future
完成。
所以我很好奇背后的机制。有人可以从较低的层面解释它,或者提供一些暗示让我去研究。
谢谢!
PS:是因为他们共享相同的ExecutionContext
?
** **更新粘贴测试代码的要求
object Main extends App{
println("Test start")
val timeout = 30000
trait Result {
val id: Int
val str = "I'm short"
}
class BigObject(val id: Int) extends Result{
override val str = "really big str"
}
def guardian = Future({
Thread.sleep(timeout)
new Result { val id = 99999 }
})
def worker(i: Int) = Future({
Thread.sleep(100)
new BigObject(i)
})
for (i <- Range(1, 1000)){
println("round " + i)
Thread.sleep(20)
Future.firstCompletedOf(Seq(
guardian,
worker(i)
)).map(r => println("result" + r.id))
}
while (true){
Thread.sleep(2000)
}
}
我很好奇你如何设法证明“结果”不能被垃圾收集,因为我会说相反,它可能很有趣。也许添加更多关于你如何验证这个的细节? –
显示代码。没有它可能会发生什么是几乎不可能的。 –
实际上,这个问题是一个普遍的问题,并不取决于具体的用例,所以很有可能在没有进一步细节的情况下回答。 –