为什么有两个运行线程而不是一个?

所以在下面:


public class JavaClass {

    public static void main(String[] args) {

        JavaClass clazz = new JavaClass();

        clazz.startCustomThread();


        clazz = new JavaClass();

        clazz.startCustomThread();

    }


    public void startCustomThread() {

        new MyThread().startThread();

    }


    private static class MyThread {

        public void startThread() {

            new Thread(() -> {

                System.out.println("In thread " + Thread.currentThread().getName());

                while (true) {

                    try {

                        Thread.sleep(1000 * 5);

                        System.out.println("Woke up " + Thread.currentThread().getName());

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }


            }).start();

        }

    }

}

输出是:


In thread Thread-1

In thread Thread-0

Woke up Thread-0

Woke up Thread-1

....  

由于clazz应该在第二个实例之后进行 GC,并且第一个线程在第一次调用的本地范围内启动,所以startCustomThread()

我的问题是为什么第一个线程没有终止?


米琪卡哇伊
浏览 147回答 3
3回答

GCT1015

如果您具体询问为什么JavaClass对象未被 GC 处理。它可能是(取决于 VM 参数)。如果您问为什么该对象生成的线程继续运行,那是因为它创建了一个新线程Thread并运行它。这只会在run()方法正常完成或被System.exit()调用时完成。

DIEA

您调用了startCustomThread两次方法,因此启动了 2 个线程。来自Thread文档:Java 虚拟机继续执行线程,直到发生以下任一情况:已调用 Runtime 类的退出方法,安全管理器已允许执行退出操作。所有不是守护线程的线程都已死亡,要么是从对 run 方法的调用返回,要么是抛出一个传播到 run 方法之外的异常。这些选项均不适用于您的情况,因此该线程仍然存在。这与垃圾收集无关。

慕村225694

该行clazz = new JavaClass();只是将新对象分配给您的本地引用,并且不会破坏该引用所引用的先前创建的对象。此行不保证对象被垃圾收集。此外,对象的垃圾回收不一定与线程的生命周期相关——您的线程可能会被中断或完成其执行,但对象仍可能存在于堆中并正在等待 GC。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java