Java更多的库谜题84:被粗暴地中断.docx

上传人:M****1 文档编号:559501994 上传时间:2024-01-19 格式:DOCX 页数:3 大小:12.83KB
返回 下载 相关 举报
Java更多的库谜题84:被粗暴地中断.docx_第1页
第1页 / 共3页
Java更多的库谜题84:被粗暴地中断.docx_第2页
第2页 / 共3页
Java更多的库谜题84:被粗暴地中断.docx_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《Java更多的库谜题84:被粗暴地中断.docx》由会员分享,可在线阅读,更多相关《Java更多的库谜题84:被粗暴地中断.docx(3页珍藏版)》请在金锄头文库上搜索。

1、 Java更多的库谜题84:被粗暴地中断public class SelfInterruption public static void main(String args) Thread.currentThread().interrupt(); if(Thread.interrupted() System.out.println(“Interrupted: “ + Thread.interrupted(); else System.out.println(“Not interrupted: “ + Thread.interrupted(); 虽然一个线程中断自己不是很常见,但这也不是没有听说过

2、的。当一个方法捕获到了一个InterruptedException特别,而且没有做好处理这个特别的预备时,那么这个方法通常会将该特别重新抛出(rethrow)。但是由于这是一个“被检查的特别”,所以只有在方法声明允许的状况下该方法才能够将特别重新抛出。假如不能重新抛出,该方法可以通过中断当前线程对特别“再构建”(reraise)。这种方式工作得很好,所以这个程序中的线程中断自己应当是没有任何问题的。所以,该程序应当进入if语句的第一个分支,打印出 Interrupted: true。假如你运行该程序,你会发觉并不是这样。但是它也没有打印 Not interrupted: false,它打印的是

3、 Interrupted: false。 看起来该程序似乎不能确定线程是否被中断了。固然,这种看法是毫无意义的。实际上发生的事情是,Thread.interrupted方法第一次被调用的时候返回了true,并且去除了线程的中断状态,所以在if-then-else语句的分支中第2次调用该方法的时候,返回的就是false。调用Thread.interrupted方法总是会去除当前线程的中断状态。方法的名称没有为这种行为供应任何线索,而对于5.0版本,在相应的文档中有一句话概要地也同样具有误导性地表达道:“测试当前的线程是否中断”Java-API。所以,可以理解为什么许多程序员都没有意识到Threa

4、d.interrupted方法会对线程的中断状态造成影响。Thread类有2个方法可以查询一个线程的中断状态。另外一个方法是一个名为isInterrupted的实例方法,而它不会去除线程的中断状态。假如使用这个方法重写程序,它就会打印出我们想要的结果true:public class SelfInterruption public static void main(String args) Thread.currentThread().interrupt(); if(Thread.currentThread().isInterrupted() System.out.println(“Inter

5、rupted: “ + Thread.currentThread().isInterrupted(); else System.out.println(“Not interrupted: “ + Thread.currentThread().isInterrupted(); 这个谜题的教训是:不要使用Thread.interrupted方法,除非你想要去除当前线程的中断状态。假如你只是想查询中断状态,请使用isInterrupted方法。这里给API设计者们的教训是方法的名称应当用来描述它们主要功能。依据Thread.interrupted方法的行为,它的名称应当是 clearInterruptStatus,由于相对于它对中断状态的转变,它的返回值是次要的。特殊是当一个方法的名称并不完善的时候,文档是否能清晰地描述它的行为就显得特别重要了。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号