Thread beenden

Diskutiere Thread beenden im Plattformprogrammierung Bereich.
H

Holger_Hessling

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

mrBrown

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

BTW: Warum Boolean?
 
H

Holger_Hessling

Es wird der ShutdownHook nicht gestartet!

Du meinst, warum Boolean und nicht boolean?
 
Zuletzt bearbeitet:
H

Holger_Hessling

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!!!
 
H

Holger_Hessling

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

mrBrown

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?
 
H

Holger_Hessling

Hm? Mein Platform.exit(); führt doch zu einem normalen Programmende, oder nicht?
 
mrBrown

mrBrown

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?
 
H

Holger_Hessling

Okay, Danke! Da ist der Haken!

Nein, der Thread ist absolut unwichtig, aber er bleibt im Taskmanager unter Windows sichtbar.
 
J

JuKu

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()
 
mrBrown

mrBrown

Das ist doch auch das falsche dafür...den Thread kann man auch einfach sterben lassen
 
Thema: 

Thread beenden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben