为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2023-06-08 19:42:05
所以在下面: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-1In thread Thread-0Woke up Thread-0Woke up Thread-1....  由于clazz应该在第二个实例之后进行 GC,并且第一个线程在第一次调用的本地范围内启动,所以startCustomThread()我的问题是为什么第一个线程没有终止?
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

如果您具体询问为什么JavaClass对象未被 GC 处理。它可能是(取决于 VM 参数)。

如果您问为什么该对象生成的线程继续运行,那是因为它创建了一个新线程Thread并运行它。这只会在run()方法正常完成或被System.exit()调用时完成。


查看完整回答
反对 回复 2023-06-08
?
DIEA

TA贡献1820条经验 获得超2个赞

您调用了startCustomThread两次方法,因此启动了 2 个线程。

来自Thread文档:

Java 虚拟机继续执行线程,直到发生以下任一情况:

  1. 已调用 Runtime 类的退出方法,安全管理器已允许执行退出操作。

  2. 所有不是守护线程的线程都已死亡,要么是从对 run 方法的调用返回,要么是抛出一个传播到 run 方法之外的异常。

这些选项均不适用于您的情况,因此该线程仍然存在。这与垃圾收集无关。


查看完整回答
反对 回复 2023-06-08
?
慕村225694

TA贡献1880条经验 获得超4个赞

该行clazz = new JavaClass();只是将新对象分配给您的本地引用,并且不会破坏该引用所引用的先前创建的对象。此行不保证对象被垃圾收集。

此外,对象的垃圾回收不一定与线程的生命周期相关——您的线程可能会被中断或完成其执行,但对象仍可能存在于堆中并正在等待 GC。


查看完整回答
反对 回复 2023-06-08
  • 3 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信