为什么interrupt()没有按预期工作,它是如何工作的

时间:2011-11-08 12:18:56

标签: java multithreading thread-safety interrupt-handling

我想中断一个线程,但是调用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();
            }
        }
    }
}

但输出看起来仍然在运行。所以任何人都可以解释它,interrupt()如何工作,谢谢

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:11)

正如其他人所说,你抓住了中断,但没有采取任何措施。您需要做的是使用诸如

之类的逻辑传播中断
while(!Thread.currentThread().isInterrupted()){
    try{
        // do stuff
    }catch(InterruptedException e){
        Thread.currentThread().interrupt(); // propagate interrupt
    }
}

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