在 Java 中有两类线程: User Thread(用户线程),Daemon Thread(守护线程)
Java 平台把操作系统的底层进行了屏蔽, 在 JVM 虚拟平台里面构造出对自己有利的机制, 这就是守护线程的由来. Daemon 的作用是为其他线程的运行提供服务, 比如说 GC 线程.
User Thread 线程和 Daemon Thread 唯一的区别之处就在虚拟机的离开, 如果 User Thread 全部撤离, 那么 Daemon Thread 也就没啥线程好服务的了, 所以虚拟机也就退出了.
守护线程用户也可以自行设定, 方法: public final void setDaemon(boolean flag)
注意点:
正在运行的常规线程不能设置为守护线程.
thread.setDaemon(true)必须在 thread.start()之前设置, 否则会跑出一个 IllegalThreadStateException 异常.
在 Daemon 线程中产生的新线程也是 Daemon 的 (这里要和 Linux 的区分, Linux 中守护进程 fork() 出来的子进程不再是守护进程)
根据自己的场景使用(在应用中, 有可能你的 Daemon Thread 还没来的及进行操作时, 虚拟机可能已经退出了)
非守护线程案例:
- public class DaemonTest {
- public static void main(String[] args) {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("thread 线程结束....");
- }
- });
- thread.start();
- System.out.println("main 线程 结束....");
- }
- }
结果输出:
main 线程 结束....
thread 线程结束....
守护线程案例:
- package cn.kafka.t;
- public class DaemonTest {
- public static void main(String[] args) {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("thread 线程结束....");
- }
- });
- // 设置为守护线程
- thread.setDaemon(true);
- thread.start();
- System.out.println("main 线程 结束....");
- }
- }
结果输出:
main 线程 结束....
结论: 主线程结束, JVM 直接退出, 守护线程不管是否运行结束都要伴随着 JVM 的退出而退出
来源: http://www.bubuko.com/infodetail-2825320.html