什么是后台(守护)线程?

所谓的后台(daemon)线程,也叫守护线程,是指程序在运行的时候,在后台提供一种通用服务的线程(例如:守护线程GC),并且,这种线程并不属于程序中不可或缺的部分;因此当所有的非后台线程结束时,程序也就终止了,同时杀死所有的后台线程。相反,只要有任何非后台线程(例如:非守护线程main())还存在,程序就不会终止。后台线程具有最低的优先级。

setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,默认(false)为User模式。setDaemon(boolean on)方法必须在线程启动(start())之前调用,当线程正在运行时调用会产生异常。

isDaemon方法将测试该线程是否为守护线程。注意:当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。  

守护线程与普通线程的唯一区别是:守护线程就是main同生共死,当main退出,它将终止而普通线程是在任务执行结束才停止

普通线程代码:

 1 package com.mianshi.easy;
 2 public class StartRunTest {
 3     /**
 4      * 后台(守护)线程实验
 5      */
 6     public static void main(String[] args){
 7         Thread thread=new ThreadDemo();
 8 
 9         //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
10         //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
11         //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
12         //thread.setDaemon(true);
13         thread.start();
14     }
15     
16     public static class ThreadDemo extends Thread{
17         @Override
18         public void run() {
19             for (int i = 0; i < 100; i++) {
20                 System.out.println("This is a Thread test"+i);
21             }
22         }
23     }
24 }
View Code

结果:

This is a Thread test0
This is a Thread test1
This is a Thread test2
This is a Thread test3
This is a Thread test4
This is a Thread test5
This is a Thread test6
This is a Thread test7
This is a Thread test8
This is a Thread test9
This is a Thread test10
This is a Thread test11
This is a Thread test12
This is a Thread test13
This is a Thread test14
This is a Thread test15
This is a Thread test16
This is a Thread test17
This is a Thread test18
This is a Thread test19
This is a Thread test20
This is a Thread test21
This is a Thread test22
This is a Thread test23
This is a Thread test24
This is a Thread test25
This is a Thread test26
This is a Thread test27
This is a Thread test28
This is a Thread test29
This is a Thread test30
This is a Thread test31
This is a Thread test32
This is a Thread test33
This is a Thread test34
This is a Thread test35
This is a Thread test36
This is a Thread test37
This is a Thread test38
This is a Thread test39
This is a Thread test40
This is a Thread test41
This is a Thread test42
This is a Thread test43
This is a Thread test44
This is a Thread test45
This is a Thread test46
This is a Thread test47
This is a Thread test48
This is a Thread test49
This is a Thread test50
This is a Thread test51
This is a Thread test52
This is a Thread test53
This is a Thread test54
This is a Thread test55
This is a Thread test56
This is a Thread test57
This is a Thread test58
This is a Thread test59
This is a Thread test60
This is a Thread test61
This is a Thread test62
This is a Thread test63
This is a Thread test64
This is a Thread test65
This is a Thread test66
This is a Thread test67
This is a Thread test68
This is a Thread test69
This is a Thread test70
This is a Thread test71
This is a Thread test72
This is a Thread test73
This is a Thread test74
This is a Thread test75
This is a Thread test76
This is a Thread test77
This is a Thread test78
This is a Thread test79
This is a Thread test80
This is a Thread test81
This is a Thread test82
This is a Thread test83
This is a Thread test84
This is a Thread test85
This is a Thread test86
This is a Thread test87
This is a Thread test88
This is a Thread test89
This is a Thread test90
This is a Thread test91
This is a Thread test92
This is a Thread test93
This is a Thread test94
This is a Thread test95
This is a Thread test96
This is a Thread test97
This is a Thread test98
This is a Thread test99
View Code

可见,在主线程中启动了默认的普通线程,此后主线程没有任何的执行语句,开始等待子线程执行,子线程得到CPU执行权后,开始执行run()方法,打印完100句话后,线程执行完成并终止,此时,主线程也会结束。程序中所有的非守护线程执行完成,程序结束。

守护线程代码:

 1 package com.mianshi.easy;
 2 public class StartRunTest {
 3     /**
 4      * 后台(守护)线程实验
 5      */
 6     public static void main(String[] args){
 7         Thread thread=new ThreadDemo();
 8 
 9         //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
10         //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
11         //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
12         thread.setDaemon(true);
13         thread.start();
14     }
15     
16     public static class ThreadDemo extends Thread{
17         @Override
18         public void run() {
19             for (int i = 0; i < 100; i++) {
20                 System.out.println("This is a Thread test"+i);
21             }
22         }
23     }
24 }
View Code

结果:

1       
View Code

此时,进入主线程,创建了一个线程,随后将它设置为后台线程,并调用start()方法,使子线程就绪,但此时,程序中没有任何非后台线程,所以,主线程可以结束,程序也会停止。

原文地址:https://www.cnblogs.com/gongxing/p/4654924.html