Java DaemonThread(守护线程)
来源:互联网 发布:而又何羡乎的而 编辑:程序博客网 时间:2024/06/16 03:36
Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;当最后一个非守护线程结束时,守护线程就会随着JVM一同结束工作。
GC (垃圾回收器)就是一个最典型的守护线程。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
下面看4个例子
(1)主线程结束,JVM会等到User Thread(用户线程)执行完毕才退出。这说明在Java中创建的线程默认是User Thread(用户线程)。
package com.demo.test;public class DeamonThreadDemo { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("user thread end, isDaemon = " + Thread.currentThread().isDaemon()); } }); //thread.setDaemon(true); thread.start(); Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { System.out.println("JVM is close"); } })); System.out.println("main end"); }}
输出
main endthread end, isDaemon = falseJVM is close
(2)主线程结束,JVM并没有等待Daemon Thread(守护线程)执行结束就直接退出了。此时Daemon Thread(守护线程)被终止。
同”例(1)”的代码,取消掉thread.setDaemon(true);
的注释。
输出
main endJVM is close
(3)在Daemon Thread(守护线程)中新建一个线程并启动,发现JVM在主线程执行结束时就退出了,并没有等待Daemon Thread(守护线程)中创建的新线程执行结束,这说明在Daemon Thread(守护线程)中创建的线程默认是Daemon Thread(守护线程)。
package com.demo.test;public class DeamonThreadDemo { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { Thread t = new Thread(new Runnable(){ @Override public void run() { System.out.println("child daemon thread start, isDaemon = " + Thread.currentThread().isDaemon()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("child daemon thread end, isDaemon = " + Thread.currentThread().isDaemon()); } }); //t.setDaemon(false); t.start(); System.out.println("daemon thread end"); } }); thread.setDaemon(true); thread.start(); try { //这里休眠是为了保证能正常创建"child daemon thread" Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { System.out.println("JVM is close"); } })); System.out.println("main end"); }}
输出
child daemon thread start, isDaemon = truedaemon thread end, isDaemon = truemain endJVM is close
(4)在Daemon Thread(守护线程)中创建的新线程虽然默认也是Daemon Thread(守护线程),但可以通过设置让其变为User Thread(用户线程)
同”例(3)”的代码,取消掉t.setDaemon(true);
的注释。
输出
child daemon thread start, isDaemon = falsedaemon thread end, isDaemon = truemain endchild daemon thread endJVM is close
1 0
- Java DaemonThread(守护线程)
- Java有两种线程分别是用户线程(UserThread)和守护线程(DaemonThread)
- [Java] DaemonThread(守护线程)简介---finally内的代码不一定会被执行
- JAVA守护进程(守护线程)
- java 守护线程(Daemon)
- java 守护线程(Daemon)
- Java 守护线程(Daemon)
- Java中的守护线程 & 非守护线程(简介)
- Java中的守护线程 & 非守护线程(简介)
- Java线程之守护线程(Daemon)
- JAVA线程中的守护线程(Daemon)
- Java线程之守护线程(Daemon)
- Java线程之守护线程(Daemon) .
- Java线程之守护线程(Daemon)
- Java线程之守护线程(Daemon)
- java守护线程和守护线程
- Java守护线程与非守护线程
- java-守护线程与非守护线程
- Linux Top 命令解析 比较详细
- 练习
- mysql 中 character set 与 collation 的点滴理解
- 关于实现ID池的小讨论
- Vmstat命令详解
- Java DaemonThread(守护线程)
- 关于cocoapods的setup慢的问题
- 阅读郭林《第一行代码》的笔记——第14章 进入实战,开发酷欧天气
- iOS开发:后台运行以及保持程序在后台长时间运行
- Javascript 严格模式use strict
- 有没有length()这个方法? String 有没有length()这个方法?
- mac下通过sublime Text的sftp插件编辑远程服务器文件
- Mybatis There is no getter for property named 'XXX' in 'class java.lang.XXX
- 欢迎使用CSDN-markdown编辑器