菜鸟笔记
提升您的技术认知

守护线程是什么-ag真人游戏

守护线程是什么?

java线程分为用户线程和守护线程。

守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。

java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setdaemon(true) 方法。

注意:

  • setdaemon(true) 必须在 start() 之前设置,否则会抛出illegalthreadstateexception异常,该线程仍默认为用户线程,继续执行
  • 守护线程创建的线程也是守护线程
  • 守护线程不应该访问、写入持久化资源,如文件、数据库,因为它会在任何时间被停止,导致资源未释放、数据写入中断等问题
public class testdaemonthread {
	public static void main(string[] args) {
		testdaemonthread();
	}
	
	public static void testdaemonthread() {
		thread t = new thread() {
			@override
			public void run() {
				//创建线程,校验守护线程内创建线程是否为守护线程
				thread t2 = new thread() {
					@override
					public void run() {
						system.out.println("t2 : "   (thread.currentthread().isdaemon() ? "daemon thread" : "non-daemon thread"));
					} 
					
				};
				t2.start();
				
				//当所有用户线程执行完,守护线程会被直接杀掉,程序停止运行
				int i = 1;
				while(true) {
					try {
						thread.sleep(500);
					} catch (interruptedexception e) {
						e.printstacktrace();
					}
					system.out.println("t : "   (thread.currentthread().isdaemon() ? "daemon thread" : "non-daemon thread")   " , time : "   i);
					if (i   >= 10) {
						break;
					}
				}
			}
			
		};
//		t.start(); //setdaemon(true) 必须在 start() 之前设置,否则会抛出illegalthreadstateexception异常,该线程仍默认为用户线程,继续执行
		t.setdaemon(true);
		t.start();
		
		try {
			thread.sleep(1000);
		} catch (interruptedexception e) {
			e.printstacktrace();
		}
	}
}

执行结果:

t2 : daemon thread
t : daemon thread , time : 1
t : daemon thread , time : 2

结论:

  • 上述代码线程t,未打印到 t : daemon thread , time : 10,说明所有用户线程停止,进程会停掉所有守护线程,退出程序
  • 当 t.start(); 放到 t.setdaemon(true); 程序抛出illegalthreadstateexception,t 仍然是用户线程,打印如下
exception in thread "main" t2 : non-daemon thread
java.lang.illegalthreadstateexception
	at java.lang.thread.setdaemon(thread.java:1359)
	at constxiong.interview.testdaemonthread.testdaemonthread(testdaemonthread.java:42)
	at constxiong.interview.testdaemonthread.main(testdaemonthread.java:6)
t : non-daemon thread , time : 1
t : non-daemon thread , time : 2
t : non-daemon thread , time : 3
t : non-daemon thread , time : 4
t : non-daemon thread , time : 5
t : non-daemon thread , time : 6
t : non-daemon thread , time : 7
t : non-daemon thread , time : 8
t : non-daemon thread , time : 9
t : non-daemon thread , time : 10
网站地图