Вопрос-ответ

How do you kill a Thread in Java?

Как уничтожить поток в Java?

Как уничтожить java.lang.Thread в Java?

Переведено автоматически
Ответ 1

Смотрите этот поток от Sun о том, почему они устарели Thread.stop(). В нем подробно рассказывается, почему это был плохой метод и что следует сделать для безопасной остановки потоков в целом.

Они рекомендуют использовать общую переменную в качестве флага, который запрашивает остановку фонового потока. Затем эта переменная может быть установлена другим объектом, запрашивающим завершение потока.

Ответ 2

Обычно вы этого не делаете..

Вы просите его прервать все, что он делает, используя Thread.interrupt() (ссылка javadoc)

Хорошее объяснение того, почему это происходит, находится в javadoc здесь (ссылка на java technote)

Ответ 3

В Java потоки не прерываются, но остановка потока выполняется совместным способом. Потоку предлагается завершить работу, и затем поток может завершиться корректно.

Часто используется volatile boolean поле, которое поток периодически проверяет и завершает работу, когда ему присваивается соответствующее значение.

Я бы не использовал a boolean для проверки, должен ли поток завершаться. Если вы используете volatile в качестве модификатора поля, это будет работать надежно, но если ваш код становится более сложным, поскольку вместо этого внутри while цикла используются другие методы блокировки, может случиться, что ваш код не завершится вообще или, по крайней мере, займет больше времени, чем вам хотелось бы.


Некоторые методы блокирующей библиотеки поддерживают прерывание.


У каждого потока уже есть логический флаг состояние прерывания, и вы должны использовать его. Это может быть реализовано следующим образом:

public void run() {
try {
while (!interrupted()) {
// ...
}
} catch (InterruptedException consumed)
/* Allow thread to exit */
}
}

public void cancel() { interrupt(); }

Исходный код адаптирован из Java Concurrency на практике. Поскольку cancel() метод является общедоступным, вы можете позволить другому потоку вызывать этот метод по своему усмотрению.

Ответ 4

Один из способов - установить переменную класса и использовать ее в качестве стража.

Class Outer {
public static volatile flag = true;

Outer() {
new Test().start();
}
class Test extends Thread {

public void run() {
while (Outer.flag) {
//do stuff here
}
}
}

}

Установите внешнюю переменную класса, т. Е. flag = true в приведенном выше примере. Установите для нее значение false, чтобы "убить" поток.

java multithreading