1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package thread; public class DeamonTest { public static void main(String[] args) { Runnable runnable = new Runnable() { public void run() { try { Thread.sleep(10000); } catch (InterruptedException e){ } System.out.println("thread exit"); } }; Thread thread = new Thread(runnable); thread.setDaemon(true); thread.start(); System.out.println("main exit"); } } 输出: main exit |
基于jdk1.8 和 linux讨论:
1. java中两类线程:deamon 和 非deamon,调用start之前 thread.setDaemon(false); 可以设置是否为daemon进程,默认为false。 如果调用的不是start函数而是run函数,就是同步执行runable的具体方法了。
2. main函数 属于非deamon
3. main函数退出后,如果有非deamon线程,jvm不会退出要等待非deamon线程退出。 如果只有deamon线程,jvm会直接退出
4. java的线程实现是 Thread调用native的start0方法进行实现(Java Native Interface)。这个方法最终调用了操作系统API实现。java线程对应的是一个真实的操作系统线程。
5. java.lang.Thread.State 里面定义了:NEW, RUNNABLE, (BLOCKED, WAITING,TIMED_WAITING), TERMINATED 六种进程状态,实际操作系统里面的定义可以不一样,由于跨平台特性java需要适配系统线程状态定义。