Daemon线程与finally语句块

当所有非守护进行(Daemon Thread)都结束时,包括main线程,虚拟机会立即退出,即使守护线程含有finally,而且守护线程此时程序逻辑还没有执行到finally语句块,则会放弃执行finally语句块,所有守护线程都结束。

public class DaemonTest {
    public static  class DaemonRunner implements Runnable{
        private long sleepTimeMills = 0;
        DaemonRunner(long time){
            sleepTimeMills = time;
        }

        public void run() {
            try{
                System.out.println("睡眠中");
                Thread.sleep(sleepTimeMills);
            }catch(InterruptedException e){
                System.out.println("睡眠时中断发生");
            }

            finally{
                System.out.println("finally模块被执行");
            }
        }
    }
    public static void main(String[] args) throws Exception{
        Thread thread = new Thread(new DaemonRunner(1000),"DaemonThread");
        thread.setDaemon(true);
        thread.start();

        //Thread.sleep(1000);
        Thread.sleep(999);
        System.out.println("main Thread is stop");
    }
    
    /*
    * output1 main thread sleep 999 mills:
    *
    * 睡眠中
    * main Thread is stop
    *
    * Process finished with exit code 0
    * */
    
    
    /* output2 main thread sleep 1000 mills:
    *
    * 睡眠中
    * finally模块被执行
    * main Thread is stop
    *
    * Process finished with exit code 0
    * */
}

总结

  1. 直到所有非守护线程最后一条语句的结束之前,守护线程和其他线程一样会按照并行逻辑正常执行,但是当所有非守护线程结束时,守护线程的所有没有来得及执行的逻辑代码都放弃执行(包括catch模块和finally模块
  2. 可能发生的情况,当main线程和守护线程睡眠的时间相等或者相差很短的时间,而且逻辑代码比较简单的情况下(如上述示例代码一样),这两种线程是有可能同时执行完的,或则main线程最后执行完;当然代码逻辑如果比较复杂,则可能发生的情况会更多
  3. 对于示例:两个线程只是相差1毫秒,但是执行的结果却不同。分4种情况:(1):main线程睡眠的时间小于Daemon线程的睡眠时间,而且main线程的代码逻辑非常简单,则很有可能mian线程执行完,Daemon线程都没有执行完;(2): main线程睡眠的时间小于Daemon线程的睡眠时间,而且main线程的代码逻辑比较复杂,则Daemon线程有可能正常退出,也可能被虚拟机终止,取决于代码相对复杂度;(3): main线程睡眠的时间大于Daemon线程的睡眠时间,而且Daemon线程的代码逻辑比较简单,则很有可能Daemon线程正常先于main线程执行完; (4): main线程睡眠的时间大于Daemon线程的睡眠时间,而且Daemon线程的代码逻辑比较复杂,则Daemon线程有可能正常退出,也可能被虚拟机终止,取决于代码相对复杂度;
  4. 因此不能在守护线程中的finally语句块中执行关闭资源的操作,很可能操作失败。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 6,641评论 0 14
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,095评论 1 18
  • 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要...
    嘟爷MD阅读 12,048评论 21 272
  • 想问问大家:A.在宝马上哭 B.在自行车上笑 C.在三轮车上笑 这三个选项你会选择哪一个呢? 以前这道题目一定有...
    迷之LYn阅读 1,333评论 0 0
  • 插图源自网络 园: 首先祝你生日快乐,希望这祝福来的不算太晚,时间真的过的好快啊,转眼又是一年了。还记得去年你生日...
    y先笙阅读 2,498评论 0 0

友情链接更多精彩内容