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