什么是守护线程?「建议收藏」

什么是守护线程?「建议收藏」Java线程分为用户线程和守护线程。守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。Java中把线程设置为守护线程的方法:在start线程之前调用线程的setDaemon(true)方法。注意:setDaemon(true)必须在start()之前设置,否则会抛出IllegalThreadStateExc…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Java线程分为用户线程和守护线程。

守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。

Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。

 

注意:

  • setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateException异常,该线程仍默认为用户线程,继续执行
  • 守护线程创建的线程也是守护线程
  • 守护线程不应该访问、写入持久化资源,如文件、数据库,因为它会在任何时间被停止,导致资源未释放、数据写入中断等问题
package constxiong.concurrency.a008;

/**
 * 测试守护线程
 * @author ConstXiong
 * @date 2019-09-03 12:15:59
 */
public class TestDaemonThread {

	public static void main(String[] args) {
		testDaemonThread();
	}
	
	//
	public static void testDaemonThread() {
		Thread t = new Thread(() -> {
			//创建线程,校验守护线程内创建线程是否为守护线程
			Thread t2 = new Thread(() -> {
				System.out.println("t2 : " + (Thread.currentThread().isDaemon() ? "守护线程" : "非守护线程"));
			});
			t2.start();
			
			//当所有用户线程执行完,守护线程会被直接杀掉,程序停止运行
			int i = 1;
			while(true) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("t : " + (Thread.currentThread().isDaemon() ? "守护线程" : "非守护线程") + " , 执行次数 : " + i);
				if (i++ >= 10) {
					break;
				}
			}
		});
		//setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateException异常,该线程仍默认为用户线程,继续执行
		t.setDaemon(true);
		t.start();
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//主线程结束
		System.out.println("主线程结束");
	}
	
}

执行结果

t2 : 守护线程
t : 守护线程 , 执行次数 : 1
主线程结束
t : 守护线程 , 执行次数 : 2

 

结论:

  • 上述代码线程t,未打印到 t : daemon thread , time : 10,说明所有用户线程停止,进程会停掉所有守护线程,退出程序
  • 当 t.start(); 放到 t.setDaemon(true);  之前,程序抛出IllegalThreadStateException,t 仍然是用户线程,打印如下
Exception in thread "main" t2 : 非守护线程
java.lang.IllegalThreadStateException
	at java.lang.Thread.setDaemon(Thread.java:1359)
	at constxiong.concurrency.a008.TestDaemonThread.testDaemonThread(TestDaemonThread.java:39)
	at constxiong.concurrency.a008.TestDaemonThread.main(TestDaemonThread.java:11)
t : 非守护线程 , 执行次数 : 1
t : 非守护线程 , 执行次数 : 2
t : 非守护线程 , 执行次数 : 3
t : 非守护线程 , 执行次数 : 4
t : 非守护线程 , 执行次数 : 5
t : 非守护线程 , 执行次数 : 6
t : 非守护线程 , 执行次数 : 7
t : 非守护线程 , 执行次数 : 8
t : 非守护线程 , 执行次数 : 9
t : 非守护线程 , 执行次数 : 10

 

 


【Java面试题与答案】整理推荐

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181653.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Hello,C++(4)继承

    Hello,C++(4)继承

    2021年7月6日
    58
  • 图形数字推理1000题及答案_小学奥数图形推理题

    图形数字推理1000题及答案_小学奥数图形推理题事情是这样滴!一个小伙伴在这两天提出一个问题如下:考虑到数字推理是浙江省考每年的必考题,图形题在去年的浙江省考中考查了四题。而图形题相较于分数数列、递推数列、多级数列等常见纯数字数列来说,在没有掌握一些常见技巧的前提下确实无从下手。这两天经过对图形题的系统性梳理发现其中有一些可操作的技巧与方法,希望能够帮助到即将踏入战场的浙江的小伙伴。当然,除了浙江的小伙伴之外,一些自主命题省份,如江苏、广东、吉…

    2022年9月9日
    3
  • Python中字符串String去除出换行符(\n,\r)和空格的问题「建议收藏」

    Python中字符串String去除出换行符(\n,\r)和空格的问题「建议收藏」Python中字符串String去除出换行符和空格的问题(\n,\r)在Python的编写过程中,获取到的字符串进场存在不明原因的换行和空格,如何整合成一个单句,成为问题。方法:一、去除空格“·”代表的为空格  strip()"···xyz···".strip()#returns"xyz""···xyz···".lstrip()…

    2022年5月27日
    144
  • matlab怎么输出插值,matlab插值方法0.ppt「建议收藏」

    matlab怎么输出插值,matlab插值方法0.ppt「建议收藏」matlab插值方法0*数学建模暑期培训数据插值*实验目的实验内容2、掌握用数学软件包求解插值问题。1、了解插值的基本内容。[1]一维插值[2]二维插值[3]实验作业*拉格朗日插值分段线性插值三次样条插值一维插值一、插值的定义二、插值的方法三、用Matlab解插值问题返回*返回二维插值…

    2022年6月3日
    39
  • 佳文分享:CAP定理

    佳文分享:CAP定理

    2021年12月13日
    40
  • 双目测距原理

    双目测距基本原理:双目测距实际操作分4个步骤:相机标定——双目校正——双目匹配——计算深度信息。相机标定:摄像头由于光学透镜的特性使得成像存在着径向畸变,可由三个参数k1,k2,k3确定;由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数p1,p2确定。单个摄像头的定标主要是计算出摄像头的内参(焦距f和成像原点cx,cy、五个畸变参数(一般只需…

    2022年4月5日
    104

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号