我试图弄清楚如何中断线程。我知道之前有人问过,但我不确定我是否理解正确。
我目前有:
public class Test implements Runnable {
public void run() {
int i = 0;
while(!Thread.currentThread().isInterrupted() && i < 100) {
System.out.println(i++);
}
}
public static void main(String args[]) {
Thread x = new Thread(new Test());
x.start();
for (int i = 0; i < 100; i++) {
System.out.println(i+100);
if (i == 75) {
x.interrupt();
}
}
}
}
这两个线程都计为100个。这是一个简单的例子,我知道但是如果我在run
方法中做了一些更复杂的事情,那么在外面可能会出现一个while循环不够好。所以我要问的是:
如果我在run
方法中有50行代码,并且我想在那50行代码中的任何地方中断线程,那么我必须加载if
s检查每条线路之间是否有中断?就我目前对整件事的理解而言,情况就是如此......这让我觉得我错过了一些东西。
感谢您的帮助:)
答案 0 :(得分:2)
您的理解是正确的 - interrupt
旨在合作而非先发制人的中断。由目标线程决定何时可以安全中断,并在那时进行适当的检查。如果线程在被阻塞时被中断,某些阻塞操作将抛出InterruptedException
,但除此之外,您可以根据需要检查Thread.interrupted()
。在大多数算法中,您不希望想要允许在任意点中断,但只能在明确定义的地方,在那里您知道状态将是一致的。
请注意,您应该使用Thread.interrupted()
而不是Thread.currentThread().isInterrupted()
进行检查,因为前者在检查后会重置中断标志。一旦isInterrupted
返回true,它将在每次调用时继续返回true,直到重置标志,这可能不是你想要的。
答案 1 :(得分:0)
加上Ian Roberts已经说过的话,
如果您没有编写顶级应用程序(即,如果您正在编写的代码将由其他任何人调用),则只有一种合理的方法来处理InterruptedException
; < / p>
InterruptedException
。任何其他方式行为的代码都可能会让任何人调用它而感到惊讶,而且调用者从来都不是一个好主意。
如果您正在编写顶级应用程序,请继续以适合您的方式处理InterruptedException
。 (只是希望你所调用的库不会做任何让你感到惊讶的事情。)