Thread beenden

Holger_Hessling

Aktives Mitglied
Es geht um folgendes Runnable:
Code:
public class MyTask implements Runnable {
  private Boolean alive;

  @Override
  public void run() {
    alive = true;
    Runtime.getRuntime().addShutdownHook(new Thread() {
      @Override
      public void run() {
        alive = false;
      }
    });

    while (alive) {
      // mache dies immer
    }
  }
}
Ich habe hier versucht, den Thread mittels einem ShutdownHook zu beenden, wenn sich die ganze Anwendung beendet. Der ShutdownHook soll über
Code:
alive = false;
die while-Schleife beenden und somit die run()-Methode auslaufen lassen, damit der entsprechende Task beendet wird. Das passiert aber leider nicht. Offenbar wird der ShutdownHook nicht gestartet. Kann mir bitte einer sagen, wo mein Denkfehler liegt?
 

mrBrown

Super-Moderator
Mitarbeiter
Wird der Shutdown-Hook nicht aufgerufen oder wird nur die Schleife nicht verlassen, das kann auch noch eine andere Ursache haben?

BTW: Warum Boolean?
 

Holger_Hessling

Aktives Mitglied
Hab's gelöst - einfacher und ohne den ShutdownHook! Habe eine Methode hinzugefügt, mit der ich alive = false setzen kann.
Code:
public class MyTask implements Runnable {
  private Boolean alive;

  @Override
  public void run() {
    alive = true;

    while (alive) {
      // mache dies immer
    }
  }

  public void stopThread() {
    alive = false;
  }
}
An der Stelle im Code, an dem ich den Thread starte und Zugriff auf ihn habe, wird auch das Beenden der Anwendung geregelt. Hier hab ich den Aufruf StopThread(); paltziert.
Code:
    public void beendenMitNachfragen() {

       Alert alert = new Alert(AlertType.CONFIRMATION);

       alert.initModality(Modality.APPLICATION_MODAL);
       alert.initOwner(BMCheck.getPrimaryStage());
       alert.setHeaderText(null);
       alert.setContentText("Wollen Sie das Programm wirklich beenden?");

       ButtonType btnYes = new ButtonType("Ja");
       ButtonType btnNo = new ButtonType("Nein");
       ButtonType btnCancel = new ButtonType("Abbrechen", ButtonData.CANCEL_CLOSE);

       alert.getButtonTypes().setAll(btnYes, btnNo, btnCancel);

       Optional<ButtonType> result = alert.showAndWait();

       if (result.get() == btnYes) {
           myTask.stopThread();
           Platform.exit();
       }
   }
Ich habe aus keinem besonderen Grund Boolean verwendet. Hab nicht darüber nachgedacht. Mit boolean geht's natürlich auch :)!

Danke Dir!!!
 

Holger_Hessling

Aktives Mitglied
Bin diesem Satz aufgesessen:

"Zusätzlich zum bewussten Abbruch wird der Thread auch immer dann ausgeführt, wenn das Programm normal beendet wird. Es können mehrere Threads als Shutdown-Hooks installiert sein. Wenn sich dann die JVM beendet, werden die Threads in beliebiger Reihenfolge abgearbeitet."

Quelle: Die zweite Insel - Java SE 8 Standard-Bibliothek - 2., aktualisierte und erweiterte Auflage- Seite 273 Abschnitt 3.13.1
 

mrBrown

Super-Moderator
Mitarbeiter
Bin diesem Satz aufgesessen:

"Zusätzlich zum bewussten Abbruch wird der Thread auch immer dann ausgeführt, wenn das Programm normal beendet wird. Es können mehrere Threads als Shutdown-Hooks installiert sein. Wenn sich dann die JVM beendet, werden die Threads in beliebiger Reihenfolge abgearbeitet."

Quelle: Die zweite Insel - Java SE 8 Standard-Bibliothek - 2., aktualisierte und erweiterte Auflage- Seite 273 Abschnitt 3.13.1
An dem Satz ist doch aber nichts falsch oder missverständlich?
 

mrBrown

Super-Moderator
Mitarbeiter
Nein, das beendet den JavaFX-Thread, wie's auch im JavaDoc dazu steht.

Wenn es noch anderen (non-demon-)Threads gibt, läuft das Programm weiter, wie in diesem Fall.

Macht der Thread irgendwas wichtiges, was auf jeden Fall zuende gebracht werden muss?
 

JuKu

Top Contributor
Hab's gelöst - einfacher und ohne den ShutdownHook! Habe eine Methode hinzugefügt, mit der ich alive = false setzen kann.
Code:
public class MyTask implements Runnable {
  private Boolean alive;

  @Override
  public void run() {
    alive = true;

    while (alive) {
      // mache dies immer
    }
  }

  public void stopThread() {
    alive = false;
  }
}

So etwas gibt es schon!
Die Methode nennt sich isInterupted().
Java:
Thread.currentThread().isInterupted()
 

Ähnliche Java Themen


Oben