java daemon 线程_【转】关于Java的Daemon线程的理解

本文详细介绍了Java中的用户线程和守护线程,强调了守护线程在JVM退出条件中的作用。通过实例代码展示了如何创建守护线程,并使用`jstack`工具观察线程状态。当所有用户线程结束,只剩下守护线程时,JVM会退出。通过在程序中添加ShutdownHook验证了这一行为。
摘要由CSDN通过智能技术生成

网上对Java的Daemon线程的说法很多,看的人头晕。

所以自己就来总结一下:

Java语言自己可以创建两种进程“用户线程”和“守护线程”

用户线程:就是我们平时创建的普通线程.

守护线程:主要是用来服务用户线程.

那么如何来区分这两种线程呢?

其实在JDK的文档中已经说明的很清楚了:

* The Java Virtual Machine exits when the only threads running are all

* daemon threads.

即:

当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出.

下面我们用实验来说明,当线程只剩下守护线程的时候,JVM就会退出.

代码如下:

public class DaemonRunner implements Runnable {

public void run() {

while (true) {

for (int i = 1; i <= 100; i++) {

System.out.println(i);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

Thread daemonThread = new Thread(new DaemonRunner());

// 设置为守护进程

daemonThread.setDaemon(true);

daemonThread.start();

System.out.println("isDaemon = " + daemonThread.isDaemon());

Scanner scanner = new Scanner(System.in);

// 接受输入,使程序在此停顿,一旦接受到用户输入,main线程结束,JVM退出!

scanner.next();

//AddShutdownHook方法增加JVM停止时要做处理事件:

//当JVM退出时,打印JVM Exit语句.

Runtime.getRuntime().addShutdownHook(new Thread(){

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("JVM Exit!");

}

});

}

}

当程序运行的时候,Daemon线程会不断的在控制台打印数字,而main线程是一个用户线程由于”scanner.next()”

等待用户输入,属于阻塞了.此时JVM当然不会退出.

验证步骤:

这个时候只要我们确定当前用户线程只有一个,即只要main线程退出,然后检查JVM是否真的退出了。

那么我们如何确定当前的JVM虚拟机中的,当前的用户线程和daemon有多少呢?

我们可以用JDK中自带的查看堆栈工具jstack.

jstack 3308(即当前要探测的JVM进程的进程ID)

得到结果如下:

56b701fa28bb96a2b53f685f9469429f.png

387919ccda2b47c14cede6dec3323656.png

我们会看到当前JVM进程中跑着很多线程,但是只有main线程是用户线程,其他线程要不是daemon线程(如Low Memory Detector或Thread-0),要不就是虚拟机内部线程(如VM Thread 和VM Periodic Task Thread,这些线程我们不用考虑).

因此当用户线程main线程退出时(在本程序中,在控制台输入一个字符然后回车),如果JVM确实退出了的话,会调用ShutDownHook在控制台上打印“JVM Exit!.”

如果没有退出的话,当然就不会打印了.

验证结果:

控制台成功打印“JVM Exit!”,JVM退出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值