当前位置: 首页 > 面试题库 >

我想让我的线程处理中断,但是我无法捕获InterruptedException,因为它是一个已检查的异常

蒋高超
2023-03-14
问题内容

我在Java中有一个线程

t.interrupt();

使t(一个不同的线程)被中断。我希望“
t”线程能够捕获到一个,InterruptedException但是Eclipse不允许我InterruptedException说它没有放在try主体中。我该如何InterruptedException打电话?我使用t.interrupt()错了吗?


问题答案:

尽管其他答案是正确的,但更充分的解释是适当的。

线程只能在其执行的特定点安全地中断(一般而言)。特别是,它可以在发出wait()呼叫或调用可以发出的服务时安全地中断wait()。这就是为什么InterruptedException是检查异常而不是运行时(未检查)异常的原因。允许在任何时候任意中断线程将使执行不确定(至少是指定JVM的方式)。有一种Thread#stop()方法被强烈建议不要使用,因为它引起的问题多于解决的问题。从Javadoc

这种方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(由于未经检查的ThreadDeath异常会自然传播堆栈)。如果先前由这些监视器保护的任何对象处于不一致状态,则损坏的对象将变为其他线程可见,从而可能导致任意行为。stop的许多用法应由仅修改某些变量以指示目标线程应停止运行的代码代替。目标线程应定期检查此变量,如果该变量指示要停止运行,则应有序地从其运行方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法来中断等待。为什么不赞成使用Thread.stop,Thread.suspend和Thread.resume?。

如果需要中断正在运行的线程,则必须使用Thread.interrupted().isInterrupted()或轮询共享变量来定期轮询中断状态,并自己采取适当的措施。

注意:上面的术语“中断”(作为方法名的一部分除外)是一般意义上的,而不是call的特定含义Thread#interrupt()



 类似资料: