прерывание () не работает - PullRequest
8 голосов
/ 25 декабря 2011

Я пытаюсь завершить поток в следующем коде:

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). У кого-нибудь есть идея, почему этот поток не будет прерван?

Edit:

Проблема найдена. Оказывается, было два экземпляра этой темы. Я прилагаю проблемный код, который приводит к этому:

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

Ответы [ 2 ]

5 голосов
/ 25 декабря 2011

Согласно документам , если вы вызываете interrupt(), когда поток находится в состоянии wait(), флаг прерывания не будет установлен. Вы должны получить прерванное исключение, которое выйдет из цикла (и потока).

EDIT

Согласно моему комментарию и вашему ответу, проблема в том, что у вас запущено несколько таких потоков.

2 голосов
/ 25 декабря 2011

Возможно, вы звоните cancel не в ту ветку.Если вы посмотрите на него, он cancel() отменяет эту тему .Вы, вероятно, хотите отменить другой поток.

Также верно, что ваш вызов isInterrupted() не нужен, но это не приведет к потере прерываний ...


С другой стороны, если *Метод 1011 * - это метод класса, который расширяет Thread, тогда this может быть потоком, который требует отмены.(Проблема для нас, людей, пытающихся ответить, заключается в том, что в первоначальном вопросе было / было недостаточно деталей ...)

...