我究竟如何中断线程?

时间:2015-06-26 13:12:58

标签: java multithreading interrupt

我试图弄清楚如何中断线程。我知道之前有人问过,但我不确定我是否理解正确。

我目前有:

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检查每条线路之间是否有中断?就我目前对整件事的理解而言,情况就是如此......这让我觉得我错过了一些东西。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

您的理解是正确的 - interrupt旨在合作而非先发制人的中断。由目标线程决定何时可以安全中断,并在那时进行适当的检查。如果线程在被阻塞时被中断,某些阻塞操作将抛出InterruptedException,但除此之外,您可以根据需要检查Thread.interrupted()。在大多数算法中,您不希望想要允许在任意点中断,但只能在明确定义的地方,在那里您知道状态将是一致的。

请注意,您应该使用Thread.interrupted()而不是Thread.currentThread().isInterrupted()进行检查,因为前者在检查后会重置中断标志。一旦isInterrupted返回true,它将在每次调用时继续返回true,直到重置标志,这可能不是你想要的。

答案 1 :(得分:0)

加上Ian Roberts已经说过的话,

如果您没有编写顶级应用程序(即,如果您正在编写的代码将由其他任何人调用),则只有一种合理的方法来处理InterruptedException; < / p>

  • 安全地中止您的来电者要求您做的任何操作,
  • 如果您的来电者想要做的话,请务必将问题保留在调用者可以开始新操作的状态,
  • 重新抛出InterruptedException

任何其他方式行为的代码都可能会让任何人调用它而感到惊讶,而且调用者从来都不是一个好主意。

如果您正在编写顶级应用程序,请继续以适合您的方式处理InterruptedException。 (只是希望你所调用的库不会做任何让你感到惊讶的事情。)