JavaSE 多线程——守护线程

一、守护线程

1. 守护线程概述

    Java中线程分为两大类:用户线程(User Thread)与守护线程(Daemon Thread) 守护线程,指的是程序运行时在后台提供的一种通用服务的线程,优先级比较低,只要当前JVM实例中尚存在任何一个非守护线程,守护线程就全部工作,只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作 主线程main方法是一个用户线程 守护线程可以理解为后台线程,最典型的应用就是垃圾回收线程 守护线程并非只有虚拟机内部可以提供,用户也可以手动将一个用户线程设定/转换为守护线程

2. 守护线程的特点

守护线程一般是一个死循环,所有的用户线程只要结束,守护线程自动结束

3. setDaemon()

    使用 setDaemon() 设置守护线程的开闭,true是打开守护线程,false是关闭守护线程

1. 注意事项

    thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出一个IllegalThreadStateException异常,即不能把正在运行的常规线程设置为守护线程 在守护线程中产生的新线程也是守护线程 不是所有的应用都可以分配给守护线程来进行服务的,比如读写操作或计算逻辑,即守护线程应该永远不去访问固有资源,因为它会在任何时候甚至在一个操作的中间发生中断

二、测试用例

public class ThreadTest {
          
   
	public static void main(String[] args) {
          
   
		Thread thread = new MyThread();
		thread.setName("分支线程");

		// 启动线程之前,将线程设置为守护线程
		thread.setDaemon(true);

		thread.start();

		// 主线程:主线程是用户线程
		for (int i = 0; i < 10; i++) {
          
   
			System.out.println(Thread.currentThread().getName() + ":" + i);
			try {
          
   
				Thread.sleep(1000);
			} catch (InterruptedException e) {
          
   
				e.printStackTrace();
			}
		}
	}
}

class MyThread extends Thread {
          
   
	public void run() {
          
   
		int i = 0;
		// 即使是死循环,但由于该线程是守护者,当用户线程结束,守护线程自动终止
		while (true) {
          
   
			System.out.println(Thread.currentThread().getName() + ":" + (i++));
			try {
          
   
				Thread.sleep(1000);
			} catch (InterruptedException e) {
          
   
				e.printStackTrace();
			}
		}
	}
}
经验分享 程序员 微信小程序 职场和发展