Создайте новое InterruptedException () вместо .join () - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь остановить поток, используя метод .interrupt ().

Вот мой код:

@Override
public void run() {
    try {

        for (int i = 0; i < 1000000000; i++) {
            System.out.println(threadName + " generated " + i);
            if (counter.isInterrupted()) {
                counter.join();
            }
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

Что я не понимаю, так это то, что вместо этого кода:

if (counter.isInterrupted()) {
    counter.join();
}

Если я сгенерирую исключение InterruptedException, оно также будет работать.

if (counter.isInterrupted()) {
    throw new InterruptedException();
}

Что я не понимаю, так это почему я выбрал бы одно вместо другого. Также я видел несколько подходов, где люди используют переменную логической переменной тоже. Это безопаснее, чем мой подход?

1 Ответ

0 голосов
/ 05 января 2019

InterruptedException означает, что текущий поток был прерван в ходе операции. Проблема с вашим вторым вариантом заключается в том, что вы вызываете исключение из-за прерывания потока другого . Это вызовет неправильное впечатление при вызове кода.

Как правило, когда вы ловите InterruptedException, вы должны сделать одну из трех вещей:

  • Перенесите его (без исключения, обертки), чтобы вызывающие абоненты знали о прерывании
  • Переустановите interrupt(), чтобы тот факт, что этот поток был прерван, сохраняется
  • Обработка прерывания (обычно путем очистки и отключения нити)
...