java多线程

141 阅读1分钟

main线程和子线程

JVM会等所有的非守护线程都执行完毕之后才退出。这个例子中子线程没有结束 JVM进程就结束了 是因为junit4 中 main线程执行完了之后就System.exit(0)了 所以子线程没有执行完。换在main方法中执行就印证了前面的话。

/**
 * 程序结束 是等待所有的线程都执行完毕吗?
 *
 * @author huoyun
 * @date 2019/7/14-10:52
 */
public class TestThread {

    @Test
    public void test() {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100; i += 2) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }, "t1");
        t1.start();

        Thread t2 = new Thread(() -> {
//            try {
//                Thread.sleep(5000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }, "t2");
        t2.start();
        // 虚拟机退出的回调方法,钩子
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("t1.getState:"+t1.getState());
            System.out.println("t2.getState:"+t2.getState());
        }));

        System.out.println("t1isDeamon:" + t1.isDaemon());
        System.out.println("t2isDeamon:" + t2.isDaemon());
    }
}