“全栈2019”Java多线程第十五章:当后台线程遇到finally

难度

初级

学习时间

20分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

友情提示

  • 本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
  • 本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!

1.温故知新

前面在《“全栈2019”Java多线程第五章:线程睡眠sleep()方法详解》一章中介绍了如何暂时停止执行线程。

《“全栈2019”Java多线程第六章:中断线程interrupt()方法详解》一章中介绍了如何停止线程。

《“全栈2019”Java多线程第七章:等待线程死亡join()方法详解》一章中介绍了如何让一个线程等待另一个线程执行完毕再执行

《“全栈2019”Java多线程第八章:放弃执行权yield()方法详解》一章中介绍了如何让一个线程放弃执行权。

《“全栈2019”Java多线程第九章:判断线程是否存活isAlive()详解》一章中介绍了如何判断一个线程是否存活

《“全栈2019”Java多线程第十章:Thread.State线程状态详解》一章中介绍了线程的6种状态

《“全栈2019”Java多线程第十一章:线程优先级详解》一章中介绍了如何设置/获取线程的优先级

《“全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解》一章中介绍了如何将一个线程设置为后台线程

《“全栈2019”Java多线程第十三章:线程组ThreadGroup详解》一章中介绍了线程组ThreadGroup

《“全栈2019”Java多线程第十四章:线程与堆栈详解》一章中介绍了线程与堆栈信息之间的关系

现在我们来讲解当后台线程遇到finally时,finally代码块不会被执行的情况

2.finally遇到System.exit()方法时不会被执行

我们之前在《“全栈2019”Java异常第二十一章:finally不被执行的情况》一章中讲过finally代码块不会被执行的情况,当时只讲了finally遇到System.exit()方法时的情况,很多小伙伴就说还有一种情况,那就是后台线程中遇到finally代码块它也不会被执行

我想先和大家一起回顾一下之前的finally遇到System.exit()方法时的情况。

演示:

请在try代码块中调用System.exit()方法。

请观察程序代码及结果。

代码:

Main类:

结果:

从运行结果来看,我们程序只执行了try代码块,并没有执行finally代码块。这就是当finally遇到System.exit()方法时的情况。

3.当后台线程退出时,finally不会被执行的情况

根据小节标题要求,我们需要一个后台线程,然后再在后台线程里面写上try-catch-finally代码块,马上来按照要求编写示例代码。

演示:

请在后台线程中写上try-catch-finally代码块。

请观察程序代码及结果。

代码:

Main类:

结果:

从运行结果来看,只执行了try代码块里面的内容,finally代码块里的内容没有执行。

简单的回顾一下程序代码,首先我们创建了一个线程:

然后,在线程run()方法里面调用sleep()方法,让线程睡眠10秒钟:

因为sleep()方法会产生异常,所以我们将其使用try-catch处理:

为了测试finally代码块会不会执行,从而也加上finally代码块:

接着,我们将线程设为后台线程:

然后,我们启动线程:

运行程序,执行结果:

结果显示只有try代码块被执行,finally代码块没有被执行。

注意:

该例子中的后台线程是随着前台线程退出而退出,此时finally代码块没有被执行。但如果,后台线程正常执行中,有try-catch-finally代码块时,finally仍然会被执行。

4.当后台线程活着时,有可能把try-catch-finally代码块执行完

上一小节例子演示了当我们后台线程退出时,finally代码块不会被执行。下面我们来演示另一种情况,当后台线程活着时,有可能把try-catch-finally代码块执行完。

演示:

请在后台线程中写上try-catch-finally代码块。

请观察程序代码及结果。

代码:

Main类:

结果:

从运行结果来看,try代码块和finally代码块都执行了。

为什么finally代码块又执行了呢?

这是因为finally代码块还在后台线程正常运行期,也就说后台线程在活着的时候把try代码块里面的代码执行完,紧接着就把finally代码块执行了。

总结

  • 当finally遇到System.exit()方法时不会被执行。
  • 当后台线程随着前台线程退出而退出时,finally代码块不会被执行。
  • 当后台线程活着时,有可能把try-catch-finally代码块执行完。

至此,Java中后台线程中的finally相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java多线程第十四章:线程与堆栈详解

下一章

“全栈2019”Java多线程第十六章:同步synchronized关键字

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

了解更多
举报
评论 0