112-Daemon线程的创建以及使用场景分析
Runnable不是线程,它只是一个接口,只是一个任务执行单元。它的作用是把线程控制和业务逻辑分开。真正代表线程的只有Thread。
ThreadGroup的好处:可以统一管理Thread线程。
在JDK1.7之后可以将数据10000
写为10_000
main线程此时逻辑单元已经结束,为什么还没有退出程序呢?
因为此时ThreadGroup中还有线程Thread-0处于active状态。
public class DeamonThread { public static void main(String[] args) throws InterruptedException { // new Thread t = new Thread() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " running"); Thread.sleep(1_000_000); System.out.println(Thread.currentThread().getName() + " done"); } }; // runnable -> running| -> blocked -> dead t.start(); System.out.println(Thread.currentThread().getName()); } }
t.setDaemon(true);
在main结束后自动结束所有线程守护线程Daemon有什么作用呢?
例:建立网络连接。
从A到B建立了一个长连接,长连接在一定间隔时间会发送心跳包以证明连接是可用的。比如A为客户端,B为服务器,A不断向B发送心跳包,B向A返回心跳响应。
当前工作线程创建了一个连接后,要维护这个长连接,但是当前工作线程的业务逻辑、发送数据等操作与维护连接并没有关系,此时就可以创建一个守护线程daemonThread来进行心跳检测工作。
当工作线程已经结束工作而死亡,非守护线程并不会自动死亡,而此时再去进行长连接心跳检测并没有任何意义,所以将其设置为守护线程可以在工作线程死亡时自动死亡。
思考:
在非守护线程A里创建守护线程B,当线程A结束后,线程B会自动结束么?
线程B会自动结束
在非守护线程A里创建非守护线程B,当线程A结束后,线程B会自动结束么,JVM可以正常退出么?
线程B不会自动结束,仍然在运行。
在守护线程A里创建守护线程B,当线程A结束后,线程B会自动结束么?
会。
在守护线程A里创建非守护线程B,当线程A结束后,线程B会自动结束么,JVM可以正常退出么?
会。
Thread thread = new Thread(() -> { Thread innerThread = new Thread(() -> { while (true) { System.out.println("innerThread do something for health check."); Thread.sleep(1_000); } }, "innerThread"); // innerThread.setDaemon(true); innerThread.start(); Thread.sleep(1_000); System.out.println("thread finish done."); }, "thread"); // innerThread.setDaemon(true); thread.start();
总结:
- 线程默认为非守护线程。其实main线程是一个非守护线程。
- 当运行的所有线程都是守护程序线程时,Java虚拟机才退出。
注意:必须在线程start()
启动之前调用setDaemon()
方法。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:112-Daemon线程的创建以及使用场景分析
文章字数:696
本文作者:神秘的小岛岛
发布时间:2019-11-13, 10:22:21
最后更新:2019-12-24, 17:51:35
原始链接:https://www.tuyrk.cn/wang-thread/112-daemon/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。