主线程结束子线程会跟着结束吗

Java 多线程默认不是守护线程,当使用setDaemon它设置为守护线程时,如果此时Java虚拟机中没有别的正在执行的非守护线程,那么它会随着main的结束而结束,下面我们测试一下:

将main主方法线程传递入OtherThread类中,再在TestThreadExit方法中将main主方法线程停止掉,这里为了能立刻生效所以使用了stop方法(stop 方法是不安全的,不推荐使用,可以换成interrupt方法中断,但它不会立刻生效)

public class TestThreadExit {
    public static void main(String[] args) {
        Thread mainThread = Thread.currentThread();
        OtherThread otherThread = new OtherThread(mainThread);
        otherThread.TestThreadExit();
    }
}

class OtherThread{

    private Thread main;

    public OtherThread(Thread main) {
        this.main = main;
    }

    public void TestThreadExit(){
        Thread thread = new Thread(() -> {
            try {
            	System.out.println("结束main线程");
                main.stop();
                System.out.println(main.getState() + "-->main");
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getState() + "-->thread");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread.setDaemon(true);
        thread.start();
    }
}

打印结果:

结束main线程

当我们将主方法线程停止之后,程序直接停止,OtherThread线程中的后续方法并没有执行,那么我们再将它设置为非守护线程试一下:

public void TestThreadExit(){
        new Thread(() -> {
            try {
                System.out.println("结束main线程");
                main.stop();
                System.out.println(main.getState() + "-->main");
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getState() + "-->thread");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }

打印结果:

结束main线程
TERMINATED-->main
RUNNABLE-->thread

可以看出main主线程已经直接停止了,而OtherThread这个线程还在继续执行,程序并没有直接退出
当我们调用System.exit()方法时,JVM虚拟机关闭,程序退出,所有的线程都会终结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值