java并发编程基础之Finally代码块一定会被执行吗?

        在我们的印象里一般都会用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线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值