关于Java的Daemon线程的理解
2015-10-18 13:02
337 查看
关于Java的Daemon线程的理解
网上对Java的Daemon线程的说法很多,看的人头晕。所以自己就来总结一下:
Java语言自己可以创建两种进程“用户线程”和“守护线程”
用户线程:就是我们平时创建的普通线程.
守护线程:主要是用来服务用户线程.
那么如何来区分这两种线程呢?
其实在JDK的文档中已经说明的很清楚了:
*TheJavaVirtualMachineexitswhentheonlythreadsrunningareall *daemonthreads.
即:
当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出.
下面我们用实验来说明,当线程只剩下守护线程的时候,JVM就会退出.
代码如下:
publicclassDaemonRunnerimplementsRunnable{
publicvoidrun(){
while(true){
for(inti=1;i<=100;i++){
System.out.println(i);
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
publicstaticvoidmain(String[]args){
ThreaddaemonThread=newThread(newDaemonRunner());
//设置为守护进程
daemonThread.setDaemon(true);
daemonThread.start();
System.out.println("isDaemon="+daemonThread.isDaemon());
Scannerscanner=newScanner(System.in);
//接受输入,使程序在此停顿,一旦接受到用户输入,main线程结束,JVM退出!
scanner.next();
//AddShutdownHook方法增加JVM停止时要做处理事件:
//当JVM退出时,打印JVMExit语句.
Runtime.getRuntime().addShutdownHook(newThread(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
System.out.println("JVMExit!");
}
});
}
}
当程序运行的时候,Daemon线程会不断的在控制台打印数字,而main线程是一个用户线程由于”scanner.next()”
等待用户输入,属于阻塞了.此时JVM当然不会退出.
验证步骤:
这个时候只要我们确定当前用户线程只有一个,即只要main线程退出,然后检查JVM是否真的退出了。
那么我们如何确定当前的JVM虚拟机中的,当前的用户线程和daemon有多少呢?
我们可以用JDK中自带的查看堆栈工具jstack.
jstack3308(即当前要探测的JVM进程的进程ID)
得到结果如下:
我们会看到当前JVM进程中跑着很多线程,但是只有main线程是用户线程,其他线程要不是daemon线程(如LowMemoryDetector或Thread-0),要不就是虚拟机内部线程(如VMThread和VMPeriodicTaskThread,这些线程我们不用考虑).
因此当用户线程main线程退出时(在本程序中,在控制台输入一个字符然后回车),如果JVM确实退出了的话,会调用ShutDownHook在控制台上打印“JVMExit!.”
如果没有退出的话,当然就不会打印了.
验证结果:
控制台成功打印“JVMExit!”,JVM退出!
相关文章推荐
- Java IO3:字节流
- java中this用法 super()用法 以及构造方法
- java-encodeURI decodeURI
- Spring整合Cache
- java中list去重
- IO流_Java_File类总结
- java类中获取WEB-INF路径
- 用java扫描指定文件夹下面所有以.txt, .log结尾的文件,
- BeanFactory源码分析笔记
- 关于Eclipse 和 IDEA 导入library库文件 的步骤
- Java的数组类型
- java中Interface的用法
- Java开发Web Service客户端技巧:wsimport、jaxws-maven-plugin、整合Spring
- java中extends和implements的区别
- Failed to load JavaHL Library解决方法
- java基础学习笔记——String(1)
- SpringMVC ViewResolver 找不到Model
- spring的嵌套事务
- 【JAVA得知】struts2 于 Actionsupport 任务
- java-注解