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());
}
}