use*_*220 2 java multithreading interrupt
我有一个Java调用的线程
t.interrupt();
Run Code Online (Sandbox Code Playgroud)
使t(不同的线程)中断.我希望"t"线程然后捕获一个InterruptedException但是Eclipse不会让我InterruptedException说它不会在try体中抛出.我怎样才能得到这个InterruptedException名字?我用t.interrupt()错了吗?
我真的不喜欢接受的答案,所以我想我会扔掉0.02美元.
我希望"t"线程然后捕获一个InterruptedException,但是Eclipse不会让我把一个InterruptedException说它没有被抛入try体中.如何调用InterruptedException?我使用t.interrupt()错了吗?
重要的是要意识到t.interrupt()只在线程中设置被中断的位 - 它实际上并不会中断线程的处理本身.线程可以随时安全中断.
如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long,int)方法中阻塞了这个线程,sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException.
如果此线程在可中断通道上的I/O操作中被阻塞,则通道将被关闭,线程的中断状态将被设置,并且线程将接收java.nio.channels.ClosedByInterruptException.
如果此线程在java.nio.channels.Selector中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能具有非零值,就像调用选择器的唤醒方法一样.
如果以前的条件都不成立,则将设置该线程的中断状态.
重要的是要补充一点,如果线程的中断位已经设置然后 wait()(和其他人)被调用,wait()则会InterruptedException立即抛出.
所以你无法捕捉到InterruptedExeption所有地方因为只有某些方法抛出它.正如其他人所提到的,如果你想看一个线程是否被中断(再次设置了中断位),那么正确的做法是直接用它来测试它Thread.getCurrentThread().isInterrupted().通常我们会执行以下操作:
while (!Thread.getCurrentThread().isInterrupted()) {
// process stuff
...
try {
// here's an example of a method that throws InterruptedException
Thread.sleep(100);
} catch (InterruptedException e) {
// catching InterruptedException actually clears the interrupt bit
// so it is a good pattern to re-interrupt the thread immediately
Thread.currentThread().interrupt();
// now we decide what to do since we are interrupted
break;
}
}
Run Code Online (Sandbox Code Playgroud)
关于这个主题有很多好的问题和答案:
虽然其他答案是正确的,但更全面的解释是恰当的.
线程只能在执行中的特定点安全地中断(在一般意义上).特别是,它可以在发出wait()呼叫时安全地中断,或者调用可以发出的服务wait().这就是InterruptedException检查异常而不是运行时(未检查)异常的原因.允许线程在任何时候被任意中断会使执行不确定(至少这是指定JVM的方式).有一种Thread#stop()方法被强烈弃用,因为它会导致比解决的问题更多的问题.来自Javadoc
这种方法本质上是不安全的.使用Thread.stop停止一个线程会导致它解锁它已锁定的所有监视器(这是未经检查的ThreadDeath异常向上传播的自然结果).如果先前受这些监视器保护的任何对象处于不一致状态,则受损对象对其他线程可见,可能导致任意行为.stop的许多用法应该由代码修改,该代码只是修改某个变量以指示目标线程应该停止运行.目标线程应该定期检查此变量,并且如果变量指示它将停止运行,则以有序的方式从其run方法返回.如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法来中断等待.有关更多信息,请参阅为什么Thread.stop,Thread.suspend和Thread.resume已弃用?.
如果您需要中断正在运行的线程,则必须定期轮询中断状态用Thread.interrupted()或.isInterrupted()或轮询共享变量,并采取适当行动自己.
注意:上面的术语"中断"(除了作为方法名称的一部分)是一般意义上的,而不是调用的具体含义Thread#interrupt().
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |