从头认识java-18.2 主要的线程机制-守护线程与非守护线程

Posted cynchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从头认识java-18.2 主要的线程机制-守护线程与非守护线程相关的知识,希望对你有一定的参考价值。

这一章节我们来讨论一下守护线程与非守护线程。

1.什么是守护线程?什么是非守护线程?

非守护线程:Java虚拟机在它全部非守护线程已经离开后自己主动离开。

守护线程:守护线程则是用来服务用户线程的,假设没有其它用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。


2.同样点

大家都是线程。事实上能够互相切换


3.不同点:退出的时间点

退出的先后顺序:

非守护线程->守护线程->jvm

4.注意点:

(1)设置守护线程须要在start之前,否在抛异常

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
		WritePaper writePaper = new WritePaper();
		Thread thread = new Thread(writePaper);
		thread.start();
		thread.setDaemon(true);
	}
}

class WritePaper implements Runnable {
	@Override
	public void run() {
		System.out.println("run");
	}
}

输出:

run
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.setDaemon(Thread.java:1275)
at com.ray.ch17.Test.main(Test.java:9)


(2)由于上面第三点所说的退出时间节点问题。因此会出现以下的情况

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
		WritePaper writePaper = new WritePaper();
		Thread thread = new Thread(writePaper);
		thread.setDaemon(true);
		thread.start();
	}
}

class WritePaper implements Runnable {
	@Override
	public void run() {
		System.out.println("run");
	}
}


输出:

(无)


事实上这里根本就没有运行对应的语句。由于守护线程知道如今没有须要服务的非守护线程(用户自己定义线程),就直接退出了。


假设想运行程序里面的输出。则不要设置守护:

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
		WritePaper writePaper = new WritePaper();
		Thread thread = new Thread(writePaper);
		thread.start();
	}
}

class WritePaper implements Runnable {
	@Override
	public void run() {
		System.out.println("run");
	}
}

输出:

run


(3)守护线程与非守护线程事实上是没有本质差别,能够相互切换

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
		WritePaper writePaper = new WritePaper();
		Thread thread = new Thread(writePaper);
		thread.setDaemon(true);
		thread.setDaemon(false);
		thread.start();
	}
}

class WritePaper implements Runnable {
	@Override
	public void run() {
		System.out.println("run");
	}
}

输出:

run


总结:这一章节主要介绍了守护线程与非守护线程的差别与联系。


这一章节就到这里,谢谢。

-----------------------------------

文件夹




以上是关于从头认识java-18.2 主要的线程机制-守护线程与非守护线程的主要内容,如果未能解决你的问题,请参考以下文章

从头认识java-18.2 主要的线程机制-优先级

JAVA-初步认识-第十四章-多线程(守护线setDaemon)

带你认识Flink容错机制的两大方面:作业执行和守护进程

从头认识多线程-4.3 ThreadLocal使用时需要注意的地方

从头认识java-17.4 具体解释同步-具体解释竞争条件

从头认识java-17.2 线程中断(interrupt)