这一章节我们来讨论一下守护线程与非守护线程。
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
总结:这一章节主要介绍了守护线程与非守护线程的差别与联系。
这一章节就到这里,谢谢。
-----------------------------------
时间: 2024-10-23 08:10:38