下面的程序在寻常的Hello world程序中添加了一段不寻常的曲折操作。那么,它将会打印出什么呢?


public class HelloGoodbye {public static void main(String[] args) { try { System.out.println("Hello world"); System.exit(0); } finally { System.out.println("Goodbye world"); } } } 

这个程序包含两个println语句:一个在try语句块中,另一个在相应的finally语句块中。try语句块执行它的println语句,并且通过调用System.exit来提前结束执行。在此时,你可能希望控制权会转交给finally语句块。然而,如果你运行该程序,就会发现它永远不会说再见:它只打印了Hello world。这是否违背了谜题36中所解释的原则呢?

不论try语句块的执行是正常地还是意外地结束,finally语句块确实都会执行。然而在这个程序中,try语句块根本就没有结束其执行过程。System.exit方法将停止当前线程和所有其他当场死亡的线程。finally子句的出现并不能给予线程继续去执行的特殊权限。

当System.exit被调用时,虚拟机在关闭前要执行两项清理工作。首先,它执行所有的关闭挂钩操作,这些挂钩已经注册到了Runtime.addShutdownHook上。这对于释放VM之外的资源将很有帮助。务必要为那些必须在VM退出之前发生的行为关闭挂钩。下面的程序版本示范了这种技术,它可以如我们所期望地打印出Hello world和Goodbye world:


public class HelloGoodbye1 {public static void main(String[] args) { System.out.println("Hello world"); Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { System.out.println("Goodbye world"); } }); System.exit(0); } } 

VM执行在System.exit被调用时执行的第二个清理任务与终结器有关。如果System.runFinalizerOnExit或它的魔鬼双胞胎Runtime.runFinalizersOnExit被调用了,那么VM将在所有还未终结的对象上面调用终结器。这些方法很久以前就已经过时了,而且其原因也很合理。无论什么原因,永远不要调用System.runFinalizersOnExit和Runtime.runFinalizersOnExit:它们属于Java类库中最危险的方法之一[ThreadStop]。调用这些方法导致的结果是,终结器会在那些其他线程正在并发操作的对象上面运行,从而导致不确定的行为或导致死锁。

总之,System.exit将立即停止所有的程序线程,它并不会使finally语句块得到调用,但是它在停止VM之前会执行关闭挂钩操作。当VM被关闭时,请使用关闭挂钩来终止外部资源。通过调用System.halt可以在不执行关闭挂钩的情况下停止VM,但是这个方法很少使用。

转载于:https://www.cnblogs.com/yuyu666/p/9840490.html

谜题39:您好,再见!相关推荐

  1. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  2. java解惑你知道多少_Java解惑

    第1章 绪论 第2章 表达式之谜 谜题1:奇数性 谜题2:找零时刻 谜题3:长整除 谜题4:初级问题 谜题5:十六进制的趣事 谜题6:多重转型 谜题7:互换内容 谜题8:DOS EQUIS 谜题9:半 ...

  3. java---解惑--

    Java谜题1--表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){  ret ...

  4. 从12月7日起.广东移动不再区分cmwap,cmnet流量!

    以前广东移动的流量一直区分cmwap.cmnet.实在黑暗啊.现在终于取消了.cmwap.cmnet不再区分了.全部都算在套餐内.还好一直没有取消当年开通的5元100M.什么时候能取消月租就更好了. ...

  5. jquery腾讯微博

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. jquery QQ微博

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 快递小哥5年赚260万:哪有什么天生​牛逼,不过是笨笨地熬

    优秀的人,愿意笨笨地熬. 所有的体力活 最终都是脑力活 中国300多万快递员,谁是当中最牛的哪个? 窦立国应该被提名. 窦立国是一名快递小哥,2014年,阿里巴巴在纽约上市,马云带了8位敲钟人,他就是 ...

  8. 【无标题】个人玩家是无法DIY物联设备接入阿里飞燕天猫精灵或者公版APP的

    建议个人玩家还是不要浪费时间在阿里云上了,本人是物联网的个人DIY爱好者,十年前就想着把整个家庭的设备在线控制,也学习了很多的单片机知识.从最早的FUHOMO,到现在的阿里云,一直都有在关注.在家庭端 ...

  9. dell服务器一直连响4声,戴尔电脑开机滴滴响_戴尔电脑开机滴滴响4声

    2016-06-04 19:30:26 重新插拔下内存看看,有可能是内存问题. 2017-01-03 15:01:00 AMI BIOS响铃声的一般含义是: 1. 一短声,内存刷新失败.内存损坏比较严 ...

最新文章

  1. 条件注释判断浏览器版本!--[if lt IE 9]
  2. Linux面试题集锦
  3. python抓包教程_Python爬虫入门技能:教你通过 Fiddler 进行手机抓包!
  4. 论文笔记:HKMF-T: Recover From Blackouts in TaggedTime Series With Hankel Matrix Factorization
  5. 启明云端分享|ESP32在开发环境时,环境搭建及应用、软件平台时常遇到的问题答疑(FAQ)
  6. java 获取键盘事件,java获取键盘事件
  7. 图书管理系统python语言-Python简易版图书管理系统
  8. 启动Tomcat服务时,出现org.apache.catalina.startup.VersionLoggerListener报错
  9. 拓端tecdat|SAS用梯度提升回归树(GBDT)迁移学习预测抵押贷款拖欠风险和垃圾电子邮件数据
  10. 实现MFC扩展DLL中导出类和对话框
  11. 爆销产品标题怎么写_7个让销量暴增的商品标题文案套路
  12. Python Tornado web框架简单例子
  13. MySQL varbinary类型字段 java怎么取
  14. 软件开发人员的能力模型
  15. postman设置域名_Postman中文文档——设置
  16. 设计师:设计师的知识储备之异形曲面设计 巴洛克、洛可可 设计理论(三角形构图、平衡式构图、三分法构图 、九宫格构图)之详细攻略
  17. python实现批量图片文字识别(ocr)
  18. 黑马程序员---继承(下)
  19. 最简单荣耀手机如何不用Root激活Xposed框架
  20. 码科同城小程序源码(含后端php源码)

热门文章

  1. Git_Eclipse:[1]Git安装插件
  2. .Net Core 1.1打包发布到Linux
  3. Apache多站点配置
  4. linux下mysql-5.5.15安装详细步骤
  5. 自定义UITabBar的背景图片或者颜色
  6. Google Go:初级读本
  7. Android 使用imageLoader来加载显示图片
  8. Leetcode-5199 Smallest String With Swaps(交换字符串中的元素)
  9. python3 str 数字类型判断 str.isdecimal(), isdigit(), isnumeric()
  10. 初识kbmmw 中的ORM