Main线程退出后,其他线程会继续执行么

https://zhuanlan.zhihu.com/p/74643577
为操作系统分配资源的单位是进程,就算main线程退出了,进程也还在.资源还在.在进程看来,线程应该都是平级的,没有父子关系.

结论:会的

原因:

  • JVM会在所有的非守护线程(用户线程)执行完毕后退出;main线程是用户线程;
  • 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。

如果你希望在main线程退出后,所有其他线程也退出.那么你可以把其他线程都设置为守护线程,也就是setDaemon(true). 对于线程池,你可以在main线程退出的的时候手动进行一些处理.比如shutdown等方法.

对比:

  1. 其他线程会继续执行的情况:
package com.mashibing.juc.c_000;

import java.util.concurrent.TimeUnit;

public class T01_WhatIsThread {
    private static class T1 extends Thread {
        @Override
        public void run() {
           for(int i=0; i<10; i++) {
               try {
                   TimeUnit.MICROSECONDS.sleep(1);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("T1");
           }
        }
    }

    public static void main(String[] args) {
        new T1().start();
        System.out.println("main");
    }
}

  1. main运行完后强制退出JVM,使其他线程不执行:
    public static void main(String[] args) {
        new T1().start();
        System.out.println("main");
        /*使用exit 0 退出JVM,但是使用return并达不到效果*/
        System.exit(0);
    }
}
  1. 将其他线程设置为守护线程,当main退出后,守护线程不再执行“
    public static void main(String[] args) {
        new T1().run();
        Thread t1 = new T1();
        t1.setDaemon(true);
        t1.start();
        System.out.println("main");
    }

你可能感兴趣的:(Java)