我有一个单例类,其实例在我的应用程序的整个生命周期中都是活着的。从一个singelton实例方法我创建一个Runnable线程的实例并执行它。可运行的线程实例在执行后是否会成为垃圾收集的候选者,还是会永远保留在堆中,因为我的单例实例总是处于活动状态?
例如:在下面的示例中,每次调用MySingleton.getInstance()。runMyThread()时,我都会创建一个新的MyRunnable类实例。一旦run()方法完全执行并完成后,这些MyRunnable实例是否会被考虑用于垃圾收集?
public class MySingleton
{
private MySingleton instance = null;
private MySingleton() {}
public static MySingleton getInstance()
{
if(instance == null)
{
instance = new MySingleton();
}
}
public void runMyThread()
{
Thread thread = new Thread(new MyRunnable()); //MyRunnable implements Runnable
thread.start();
}
}
答案 0 :(得分:1)
通常,对象将成为垃圾收集的候选对象 它已不在范围 和 没有引用它。
在这种情况下,假设在完成执行后没有任何内容引用Thread对象,它将成为垃圾收集的候选对象。在您的示例中,您的单例实例不包含对Thread对象的任何引用 - 它调用runMyThread(),它创建一个新的Thread对象并启动它。 Thread对象的作用域包含在runMyThread()方法中。