当我们调用Java对象的Wait()方法或线程的Sleep()方法时,我们需要捕获和处理中断异常。如果我们无法正确处理中断异常,我们将产生意外的后果!
例如,以下程序代码,中断的任务类实现可运行的接口。在Run()方法中,获取当前线程的句柄,并在while(true)循环中检测当前线程是否通过isintrupted()方法中断。)周期退出。同时,在(true)周期中,有一排螺纹。Sleep(100)代码并捕获中断的异常异常。整个代码如下所示。
上面代码的原始含义是检查线程是否通过ISInterrupt()方法中断。此时,将设置执行线程的中断徽标,以便currenthread.isinterrupted()将返回真实,以便您可以退出WALE循环。
这没什么错!但是它真的是这样吗?我们创建了一个中断的测试类,用于测试,并且代码如下所示。
我们运行主要方法,如下所示。
这与我们的想法不同!没有相同的!没有相同的!为什么这是?
上面的代码清楚地调用线程的中断()方法以中断线程,但它不起作用。原因是,当线程的运行()方法在大多数情况下都被阻塞时,当其他线程为用于通过调用执行线程的中断()方法中断执行线程,中断会触发中断。Exception是异常的。在触发中断异常异常时,JVM将同时清除线程的线路中断标志。
由于清除了对问题的分析,如何中断线程并退出程序?
正确的处理方法应在捕获中断的任务类中的Run()方法中的异常之后重新设置中断标志。因此,正确的中断任务类的代码如下所示。
可以看出,我们已经在捕获代码块中添加了一系列代码,该代码块捕获了中断的异常异常。
这使我们能够捕获中断异常异常,并可以重新设计线程的中断徽标位置以中断执行的当前线程。
我们再次运行中断测试类的主要方法,如下所示。
处理中断异常时要小心。如果将执行线程的Interrupt()方法调用以中断执行线程,则会抛出中断异常,而JVM将同时清除执行线程的中断标志,同时触发中断异常。)目前执行线程的方法,将返回false。此时,正确的处理方法是捕获线程的运行()方法中的中断异常异常,并重置中断徽标位(即,在捕获中断异常异常的捕获代码块回想起当前线程的中断()方法)。
本文分享了华为的真诚云社区,作者:宾赫。