daemon线程既守护线程,而在jdk中对于Thread中针对守护线程有专门的API,如下:

java线程基础巩固---Daemon线程的创建以及使用场景分析_main函数

而之前在公司项目中就看到过有人使用过Thread中的这个API,但是对于它的使用场景完全不知,所以这次好好的学习一下,下面直接上代码来阐述它。

java线程基础巩固---Daemon线程的创建以及使用场景分析_守护线程_02

编译运行:

java线程基础巩固---Daemon线程的创建以及使用场景分析_守护线程_03

很简单,但是这里可以看到在main函数执行完成之后【关于main函数是否真的退出可以用jconsole去查看一下既可,之前也已经查看过】,咱们新创建的Thread-0线程并未退出,这时由于咱们的Thread-0线程还是属于活跃状态,并未执行完,那接下来给我们的线程设置一个daemon属性再看结果,如下:

java线程基础巩固---Daemon线程的创建以及使用场景分析_客户端_04

编译运行:

java线程基础巩固---Daemon线程的创建以及使用场景分析_客户端_05

可见这时当main线程一结束,其我们的线程也退出了。这也是使用守护之后的一个直观效果,而实用价值其实也是蛮大的,这时可以联想到一个实际要使用daemon线程的场景:客户端与服务器端建立一个TCP的长链接,然后当连接建立之后就创建一个线程来给服务器发送心跳包以便服务器能监听客户端的网络状态,这时如果连接断开了那这个心跳线程也得跟着断开,下面来模拟一下:

java线程基础巩固---Daemon线程的创建以及使用场景分析_main函数_06

编译运行:

java线程基础巩固---Daemon线程的创建以及使用场景分析_守护线程_07

发送t线程一执行完,在里面创建的心跳线程也立马终止了,刚好满足我们的场景需求,而如果不给心跳线程设置成deamon线程再看结果:

java线程基础巩固---Daemon线程的创建以及使用场景分析_main函数_08

java线程基础巩固---Daemon线程的创建以及使用场景分析_守护线程_09

很显然当t线程结束之后里面的心跳线程就不会退出了,当然啦不通过给心跳线程设置守护线程也能达到当连接断开之后其心跳线程也退出,自己写逻辑控制既可,但是有了守护线程那这个逻辑我们就可以避免自己写了。

下面再来细读一下jdk对它的描述:

java线程基础巩固---Daemon线程的创建以及使用场景分析_守护线程_10

那不信这个邪,来试一下:

java线程基础巩固---Daemon线程的创建以及使用场景分析_main函数_11

编译运行:

java线程基础巩固---Daemon线程的创建以及使用场景分析_客户端_12

这个异常在JDK中也有描述,如下:

java线程基础巩固---Daemon线程的创建以及使用场景分析_main函数_13