JAVA Thread как уничтожить
Не получается уничтожить Thread
void disable(){
System.out.println("thread disable" + isActive);
isActive=false;
}
void MyThread(){
isActive = true;
}
public void run(){
while(isActive){
try {
System.out.println("thread enable " + isActive);
Thread.sleep(60000); // 1000 - 1 сек
} catch (InterruptedException e) {
}
}
}
Запускаю вызовом метода MyThread и run все окей, вызываю метод disable он выполняется, но тред остается активным, что не так делаю?
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Убедитесь, что isActive у вас volatile:
private volatile boolean isActive;
Без volatile изменения не будут видны в другом потоке потому цикл никогда не остановится.
И как правильно заметил Stanislav Volodarskiy пока поток спит в Thread.sleep изменения isActive никак на него не повлияют. Т.е. в вашем случае остановка может занять до 60 секунд, пока поток не проснется.
Правильный способ остановить будет послать interrupt. Итого рабочий пример:
public class MyThread extends Thread {
private volatile boolean isActive = true;
void disable() {
System.out.println("thread disable" + isActive);
isActive = false;
this.interrupt();
}
@Override
public void run() {
while (isActive) {
try {
System.out.println("thread enable " + isActive);
Thread.sleep(60000); // 1000 - 1 сек
} catch (InterruptedException e) {
}
}
}
public static void main(String argv[]) throws InterruptedException {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(5000); // даем время потоку запуститься и заснуть
thread.disable(); // останавливаем
thread.join(); // ждем завершения потока
}
}