位置: IT常识 - 正文

Java守护线程(java守护线程和本地线程区别)

编辑:rootadmin
Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。 守护线程是所有非守护线程的保姆,当所有非守护线程执行完成或退出了,即使还有守护线程在运行,JVM也会直接退出,因此守护线程通常是用来处理一些辅助工作。 反之,对于非守护线程,只要有一个在运行,JVM就不会退出。 典型的守 ...

Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。

守护线程是所有非守护线程的保姆,当所有非守护线程执行完成或退出了,即使还有守护线程在运行,JVM也会直接退出,因此守护线程通常是用来处理一些辅助工作。

反之,对于非守护线程,只要有一个在运行,JVM就不会退出。

典型的守护线程如垃圾回收GC线程,当用户线程都结束后,GC也就没有单独存在的必要,JVM直接退出。

我们可以通过Thread对象的setDaemon(boolean on)方法设置是否为守护线程,要在start之前设置:

Thread thread = new Thread(runnable);thread.setDaemon(true); // true表示守护线程,false表示用户线程thread.start();

需要注意的是,如果没有显示调用setDaemon方法进行设置,线程的模式是取决于父线程是否为守护线程,也就是创建此线程所在的线程。

如果父线程是守护线程,创建的线程默认是守护线程;

如果父线程是用户线程,创建的线程默认是用户线程。

这可以从Thread类的init方法源代码中看出:

Thread parent = currentThread();this.daemon = parent.isDaemon();

对于daemon的设置,保存在了Thread对象的成员变量中,Thread提供了setter/getter:

private boolean daemon = false;//是否为守护线程public final void setDaemon(boolean on) {//SecurityManager安全检查,本文不展开讨论checkAccess();//检查线程是否已启动,已启动无法设置daemonif (isAlive()) {throw new IllegalThreadStateException();}daemon = on;}public final boolean isDaemon() {return daemon;}

setDaemon方法中通过isAlive判断线程是否已启动,已启动状态下不允许修改,抛出IllegalThreadStateException异常。

接着我们用示例来验证一下守护线程和非守护线程的区别。

以下是守护线程示例:

Thread t = new Thread(() -> {System.out.println("before");ThreadUtil.sleep(5000);System.out.println("after");});//显式设置daemon为truet.setDaemon(true);t.start();ThreadUtil.sleep(1000);System.out.println("exit");

输出:

beforeexit

可以发现,当线程设置为守护线程后,主线程一旦执行完毕,程序退出,守护线程也随着立即终止。

以下是非守护线程示例:

Thread t = new Thread(() -> {System.out.println("before");ThreadUtil.sleep(5000);System.out.println("after");});//显式设置daemon为falset.setDaemon(false);t.start();ThreadUtil.sleep(1000);System.out.println("exit");

输出:

beforeexitafter

虽然主线程已经执行完毕,但创建的非守护线程还在运行。

具体JVM是如何通过daemon字段控制线程的,这在JDK中找不到相应源码,需要深入hotspot C++源码进行分析,后续有必要再追加更新。

本文链接地址:https://www.jiuchutong.com/zhishi/310482.html 转载请保留说明!

上一篇:织梦dedecms首页列表页获取文章带链接tag标签(织梦官方网站)

下一篇:帝国cms如何解决截图出现黑边的问题(帝国cms使用手册)

  • 女生玩气球视频(能上网qq上不去)(玩气球的小女孩舞蹈完整版)

  • 为什么钉钉群我进不去(钉钉群为什么不显示)

  • iPhone录屏红色栏消除(iphone录屏红色栏消除app)

  • 华为手机长时间不动就收不到微信(华为手机长时间没用充电没反应怎么办)

  • mp3只能充电无法传输(mp3只能充电无法传输华为手机)

  • 手机怎么录制mp4格式的视频(手机怎么录制mp4格式录音)

  • 华为手机老是有提示音但是没消息怎么关闭(华为手机老是有语音播报怎么关闭)

  • nowplugin是什么文件(now是什么中文)

  • 设置消息免打扰对方知道吗(设置消息免打扰对方能看到吗)

  • 苹果8id被锁定如何解锁(iphone8plusid被锁)

  • 抖音直播没人看怎么办(为什么我抖音直播没人看)

  • ipad mini可以用apple pencil吗(ipad mini可以用鼠标吗)

  • 打印机一直闪红灯怎么回事(打印机一直闪红灯无法打印)

  • 手机卡能办副卡吗(手机卡怎么办理副卡)

  • iphone11怎么把联系人拉黑(iphone11怎么连接互联网)

  • Reno Ace怎么恢复微信聊天记录(oppo ace如何恢复出厂设置)

  • 怎么解决qq预设上限(qq预设账号过多怎么处理)

  • iphone活动添加在哪里(iphone活动怎么添加)

  • 外星人15r2清灰教程(外星人15r3清灰)

  • mate30什么系统(mate30最新系统好用吗)

  • 微信自建位置能删除吗(微信自建位置能修改吗)

  • 荣耀20熄屏显示时间如何设置(荣耀20s灭屏显示)

  • win10电源选项在哪(win10电脑电源选项怎样设置最好)

  • 人工智能导论(6)——机器学习(Machine Learning)(人工智能导论课后题答案)

  • 【机器学习面试总结】————(一)

  • DedeCMS织梦专题页调用方法(织梦技术论坛)

  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设 电脑维修 湖南楚通运网络