守护线程和用户线程的区别

如果JVM中所有的线程都是守护线程,那么JVM就会退出,进而守护线程也会退出。

如果JVM中还存在用户线程,那么JVM就会一直存活,不会退出。

由此可以得到:

守护线程是依赖于用户线程,用户线程退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。

用户线程是独立存在的,不会因为其他用户线程退出而退出。

默认情况下启动的线程是用户线程,通过setDaemon(true)将线程设置成守护线程,这个函数务必在线程启动前进行调用,否则会报java.lang.IllegalThreadStateException异常,启动的线程无法变成守护线程,而是用户线程。

现在我们开始进行试验:

在主线程中启动守护线程

package com.thread.model.threads;


/**
 * Hello world!
 *
 */
public class ThreadClass 
{
    public static void main( String[] args )
    {
        Thread thread = new Thread(new Runnable() {


public void run() {
while(true) {
try {
System.out.println("守护线程心跳一次");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
       
        });
        
        thread.setDaemon(true);//将该线程设置为守护线程
        
        thread.start();
        
        try {
Thread.sleep(10000);
Thread currentthread = Thread.currentThread();
System.out.println("主线程"+currentthread.getName()+"退出!");
} catch (InterruptedException e) {
e.printStackTrace();
}
    }

}

得出的结果是:


发现主线程一旦退出,守护线程也就不再运行,直接退出了。


那如果主线程启动了两个线程,一个是守护线程,一个是用户线程,主线程退出,守护线程会不会退出呢?我们来测试一下

package com.thread.model.threads;


/**
 * Hello world!
 *
 */
public class ThreadClass 
{
    public static void main( String[] args )
    {
        Thread thread1 = new Thread(new Runnable() {


public void run() {
while(true) {
try {
Thread currentthread1 = Thread.currentThread();
System.out.println("守护线程"+currentthread1.getName()+"心跳一次");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
       
        });
        
        thread1.setDaemon(true);//将该线程设置为守护线程
        
        thread1.start();
        
        Thread thread2 = new Thread(new Runnable() {


public void run() {
while(true) {
try {
Thread currentthread2 = Thread.currentThread();
System.out.println("用户线程"+currentthread2.getName()+"心跳一次");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
       
        });
        
        thread2.start();
        
        try {
Thread.sleep(10000);
Thread currentthread = Thread.currentThread();
System.out.println("主线程"+currentthread.getName()+"退出!");
} catch (InterruptedException e) {
e.printStackTrace();
}
    }
}


主线程退出后,守护线程依然在运行!

猜你喜欢

转载自blog.csdn.net/weixin_39935887/article/details/80623769
今日推荐