0%

16.4.2 后台线程

16.4.2 后台线程

什么是后台线程

后台线程(Daemon Thread),是在后台运行的一种线程,后台线程主要用来向其他的线程提供服务JVM的垃圾回收线程就是典型的后台线程。

后台线程特征

后台线程有个特征:如果所有的前台线程都死亡,后台线程会自动死亡

如何把一个线程设置成后台线程

调用Thread对象的setDaemon(true)方法可将指定线程设置成后台线程。

程序示例

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
27
28
public class DaemonThread extends Thread
{
// 定义后台线程的线程执行体与普通线程没有任何区别
public void run()
{
for (int i = 0; i < 1000 ; i++ )
{
System.out.println(getName() + " " + i);
}
System.out.println("后台线程结束");
}
public static void main(String[] args)
{
DaemonThread t = new DaemonThread();
// 将此线程设置成后台线程
t.setDaemon(true);
// 启动后台线程
t.start();
for (int i = 0 ; i < 10 ; i++ )
{
System.out.println(Thread.currentThread().getName()
+ " " + i);
}
// -----程序执行到此处,前台线程(main线程)结束------
// 后台线程也应该随之结束
System.out.println("前台(main)线程结束");
}
}

下面程序将执行线程设置成后台线程,可以看到:

当所有的前台线程死亡时,后台线程随之死亡。当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。

1
2
3
4
5
6
7
8
9
10
11
12
13
main  0
main 1
......
main 7
main 8
Thread-0 0
main 9
前台(main)线程结束
Thread-0 1
Thread-0 2
......
Thread-0 16
Thread-0 17

上面程序中先将t线程设置成后台线程,然后启动该线程,本来该线程应该执行到循环变量i等于999时才会结束,
但运行该程序时不难发现该后台线程无法运行到循环变量i等于999时,因为程序中唯一的前台线程(main线程)运行结束后,JVM会主动退出,因而后台线程也就被结束了。

如何判断一个线程是否是后台线程

Thread类还提供了一个isDaemon()方法,用于判断指定线程是否为后台线程。

从上面程序可以看出:

前后台的默认情况

  • 主线程默认是前台线程,
  • 前台线程创建的子线程默认是前台线程,
  • 后台线程创建的子线程默认是后台线程。

后台线程死亡需要一定之间

当所有的前台线程死亡后,JVM会给后台线程发出死亡通知,但后台线程从接收死亡通知到真正死亡,需要一定时间。

要先设置为后台线程再启动线程

要将某个线程设置为后台线程,必须在该线程启动之前设置,也就是说,setDaemon(true)必须在star()方法之前调用,否则会引发IllegalThreadStateException异常。

原文链接: 16.4.2 后台线程