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();      // ждем завершения потока
  }
}
→ Ссылка