6

我想中断一个线程,但调用interrupt()似乎不起作用。下面是示例代码:

public class BasicThreadrRunner {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Basic(), "thread1");
        t1.start();
        Thread t3 = new Thread(new Basic(), "thread3");
        Thread t4 = new Thread(new Basic(), "thread4");
        t3.start();
        t1.interrupt();
        t4.start();
    }
}
class Basic implements Runnable{
    public void run(){
        while(true) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.err.println("thread: " + Thread.currentThread().getName());
                //e.printStackTrace();
            }
        }
    }
}

但输出看起来像线程 1 仍在运行。任何人都可以解释这一点以及如何interrupt()工作?谢谢!

4

2 回答 2

15

线程仍在运行只是因为您捕获InterruptedException并继续运行。interrupt()主要在对象中设置一个标志Thread,您可以使用isInterrupted(). 它还会导致一些方法——特别是sleep(), join Object.wait()——通过抛出一个InterruptedException. 它还会导致一些 I/O 操作立即终止。如果您从catch块中看到打印输出,那么您可以看到它interrupt()正在工作。

于 2011-11-08T12:20:46.357 回答
14

正如其他人所说,你抓住了中断,但什么也不做。您需要做的是使用逻辑传播中断,例如,

while(!Thread.currentThread().isInterrupted()){
    try{
        // do stuff
    }catch(InterruptedException e){
        Thread.currentThread().interrupt(); // propagate interrupt
    }
}

使用循环逻辑,例如while(true)只是懒惰的编码。相反,轮询线程的中断标志以确定通过中断终止。

于 2011-11-08T13:05:53.267 回答