作者回复: 对于list里的每个Thread对象,调用Thread对象的interrupt方法。
作者回复:
有些线程就是为了为程序做一些清理或者辅助工作的。最原始的就是JVM里的执行finalize方法的线程(当然现在不推荐使用finalize方法了,这是另一说)。如果你现在debug一个Java进程,还能在frame里找到这个守护线程。
还有后面和守护线程有点关系的场景,就是发送心跳。在后面的聊天程序中,我们提出了一个心跳检查功能。因为客户端和服务器端的网络连接是不可靠的,所以对于一个成熟的软件来说,如果有涉及客户端和服务器端的长连接(可以简单认为不主动断开的连接,比如聊天的客户端服务器,HDFS等集群的worker和master的连接),都会使用心跳机制。简单来说,就是启动一个线程,然后定期发送一个心跳数据包,表示这边的程序还在正常工作。
而这个心跳线程,就应该在没有任何非守护线程的情况下结束。可以说是一个典型的守护线程的用例。
守护线程还有很多用例,可能具体的场景没有心跳检测这么直观。只要从业务逻辑上来说,这些线程不应该在没有别的工作线程在运行的情况下继续运行,那么这个线程就应该是守护线程。
作者回复: 现在懂了么?