【问题标题】:When wil the new Thread() without reference be garbage collected什么时候没有引用的 new Thread() 被垃圾回收
【发布时间】:2011-06-20 09:31:09
【问题描述】:

在下面的例子中,new Thread() 没有任何引用。有没有可能在它下面被垃圾收集到死了? 同样没有扩展 Thread 类或实现 runnable,我们如何创建线程?

public class TestFive {
    private int x;
    public void foo() {
            int current = x;
            x = current + 1;
    }
    public void go() {
            for(int i = 0; i < 5; i++) {
                    new Thread() {
                            public void run() {
                                    foo();
                                    System.out.print(x + ", ");
                            } 
                    }.start();
            } 
    }
    public static void main(String args[]){
            TestFive bb = new TestFive();
            bb.go();
    }
}

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    一个尚未启动的新线程会在以正常方式无法访问时被垃圾回收。

    已启动的新线程成为垃圾收集“根”。在它完成之前(之后)它不会被垃圾收集。

    在下面的例子中,new Thread() 没有任何引用。有没有可能在它下面被垃圾收集到死了?

    没有。它已经启动,因此在它完成/死亡之前不会被垃圾收集。它确实有一个可访问的引用,直到(至少)start() 调用返回的点。

    同样没有扩展Thread类或实现runnable,我们如何创建线程?

    在您的示例中,您创建了Thread 的匿名子类;即扩展Thread的类。

    【讨论】:

    • 对于他关于如何创建线程的问题,您应该补充一点,他实际上确实创建了Thread 的子类,尽管它是一个匿名子类。
    • 另请注意,任何正在运行的线程也会阻止 JVM 关闭。
    • 如果start方法在一两个多月后被其他代码调用,线程会被垃圾回收吗?
    • @randeepsp,时间并不重要。对于计算机来说,一秒大约是 3,000,000,000 个时钟周期(即永恒)。一年后的行为与一秒后的行为相同。
    【解决方案2】:

    不,Thread 在底层 VM 线程(无论是否为操作系统线程)完成之前无法被垃圾收集。我不确定 Thread 是否没有任何明显的引用但没有被 start()-ed 最终导致泄漏,或者是否可以收集 - 后者,我会期待。

    至于您的第二个问题 - 您的代码确实使用匿名内部类扩展 Thread,这里:

    new Thread() {
            public void run() {
                    foo();
                    System.out.print(x + ", ");
            } 
    }
    

    我个人建议,即使你确实想在这里使用匿名内部类,实现Runnable 通常更简洁:

    new Thread(new Runnable() {
        public void run() {
            foo();
            System.out.print(x + ", ");
        } 
    })
    

    这样很明显,您只是提供了一些可以运行的东西,而不是试图改变任何线程的核心行为。

    【讨论】:

      【解决方案3】:

      您的线程在完成运行后将可用于垃圾收集。 for 循环的结束不会影响它,因为 for 循环在不同的线程中运行。

      在回答您的第二个问题时,您正在通过实现自己的 run() 函数来扩展 Thread 类

      【讨论】:

        猜你喜欢
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        相关资源
        最近更新 更多