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需要适配系统线程状态定义。