资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
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(); 虽然一个线程中断自己不是很常见,但这也不是没有听说过的。当一个方法捕获到了一个InterruptedException特别,而且没有做好处理这个特别的预备时,那么这个方法通常会将该特别重新抛出(rethrow)。但是由于这是一个“被检查的特别”,所以只有在方法声明允许的状况下该方法才能够将特别重新抛出。假如不能重新抛出,该方法可以通过中断当前线程对特别“再构建”(reraise)。这种方式工作得很好,所以这个程序中的线程中断自己应当是没有任何问题的。所以,该程序应当进入if语句的第一个分支,打印出 Interrupted: true。假如你运行该程序,你会发觉并不是这样。但是它也没有打印 Not interrupted: false,它打印的是 Interrupted: false。 看起来该程序似乎不能确定线程是否被中断了。固然,这种看法是毫无意义的。实际上发生的事情是,Thread.interrupted方法第一次被调用的时候返回了true,并且去除了线程的中断状态,所以在if-then-else语句的分支中第2次调用该方法的时候,返回的就是false。调用Thread.interrupted方法总是会去除当前线程的中断状态。方法的名称没有为这种行为供应任何线索,而对于5.0版本,在相应的文档中有一句话概要地也同样具有误导性地表达道:“测试当前的线程是否中断”Java-API。所以,可以理解为什么许多程序员都没有意识到Thread.interrupted方法会对线程的中断状态造成影响。Thread类有2个方法可以查询一个线程的中断状态。另外一个方法是一个名为isInterrupted的实例方法,而它不会去除线程的中断状态。假如使用这个方法重写程序,它就会打印出我们想要的结果true:public class SelfInterruption public static void main(String args) Thread.currentThread().interrupt(); if(Thread.currentThread().isInterrupted() System.out.println(“Interrupted: “ + Thread.currentThread().isInterrupted(); else System.out.println(“Not interrupted: “ + Thread.currentThread().isInterrupted(); 这个谜题的教训是:不要使用Thread.interrupted方法,除非你想要去除当前线程的中断状态。假如你只是想查询中断状态,请使用isInterrupted方法。这里给API设计者们的教训是方法的名称应当用来描述它们主要功能。依据Thread.interrupted方法的行为,它的名称应当是 clearInterruptStatus,由于相对于它对中断状态的转变,它的返回值是次要的。特殊是当一个方法的名称并不完善的时候,文档是否能清晰地描述它的行为就显得特别重要了。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号