在我们的印象里一般都会用finally去关闭一些资源,因为这个被finally包裹的代码块一定会执行,但是存在这样一种情况,finally代码块是不会执行的。在Daemon线程里。
Daemon线程是一种支持型的线程,主要被用作程序中后台调度及支持性工作。如果一个java虚拟机中不存在非Daemon线程的时候,java虚拟机将会推出。我们可以将Thread.setDaemon(true)的方法将这个线程设置成Daemon线程。
注意Daemon线程需要在线程启动之前设置,不能再去启动之后设置。
测试 代码如下
package juc.thread;
/**
* @Description
* @Author DJZ-WWS
* @Date 2019/5/15 9:49
*/
public class DaemonThread extends Thread{
@Override
public void run() {
try {
System.out.println("执行到线程的任务了");
throw new NullPointerException("异常了,测试finally");
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
}
main方法
public static void main(String[] args) {
Thread thread= new DaemonThread();
thread.setDaemon(true);
thread.start();
}
输出的结果
原因如下:main线程(非Daemon)线程在启动了线程Daemon线程以后随着main方法执行完毕而终止,此时java虚拟机中已经没有非Daemon线程,虚拟机需要立即退出。java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonThread 立即终止,但是finally块并没有执行。
可以这样测试,让main睡眠一会,
结果如下:
这样可以看到finally里面被执行了,这是由于Daemon线程先执行结束了再去执行main线程。