interrupt()不起作用

时间:2011-12-25 00:57:37

标签: java multithreading concurrency interrupt

我试图在以下代码中终止该线程:

public synchronized void run() {
    try {
        while (!Thread.currentThread().isInterrupted()) {
            this.scan();
            this.distribute();
            this.wait();
        }
    } catch (InterruptedException e) {}
}

public void cancel() {
    this.interrupt();
}

但线程不会终止。我使用了调试器并发现在命令this.interrupt()之后,线程没有被中断(我对表达式this.isInterrupted()进行监视并且它保持false)。任何人都知道为什么这个帖子不会被打断?

编辑:

已发现问题。原来这个帖子有两个实例。我附上导致这个问题的有问题的代码:

/* (class Detector extends Thread) */
Detector detector = new Detector(board);
...
Thread tdetector  = new Thread(detector); /* WRONG!!! */
...
tdetector.start();
...

2 个答案:

答案 0 :(得分:5)

根据the docs,如果在线程处于interrupt()状态时调用wait(),则不会设置中断标志。你应该得到一个中断的异常,它将退出循环(和线程)。

修改

根据我的评论和您的回复,问题是您运行了多个这样的线程。

答案 1 :(得分:2)

你可能在错误的线程上调用cancel。如果您查看它,cancel()会取消此主题。你可能想要取消一些其他线程。

您对isInterrupted()的调用也是不必要的,但这不会导致中断丢失......


另一方面,如果cancel方法是扩展Thread的类的方法,那么this可能是需要取消的线程。 (我们这些人试图回答的问题是原始问题中的细节不够......)