# Thread beenden



## Holger_Hessling (13. Apr 2017)

Es geht um folgendes Runnable:

```
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 
	
	
	
	





```
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 (13. Apr 2017)

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 (13. Apr 2017)

Es wird der ShutdownHook nicht gestartet!

Du meinst, warum Boolean und nicht boolean?


----------



## mrBrown (13. Apr 2017)

Holger_Hessling hat gesagt.:


> Es wird der ShutdownHook nicht gestartet!


Wie beendest du denn das Programm?


Holger_Hessling hat gesagt.:


> Du meinst, warum Boolean und nicht boolean?


Ja


----------



## Holger_Hessling (13. Apr 2017)

Hab's gelöst - einfacher und ohne den ShutdownHook! Habe eine Methode hinzugefügt, mit der ich alive = false setzen kann.

```
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.

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


----------



## mrBrown (13. Apr 2017)

Das Problem vorher war, das dein Programm nicht beendet wurde, nur der JavaFX-Thread wurde beendet.




Holger_Hessling hat gesagt.:


> Ich habe aus keinem besonderen Grund Boolean verwendet. Hab nicht darüber nachgedacht. Mit boolean geht's natürlich auch !


Ersparte dir zumindest eine Fehlerquelle...


----------



## Holger_Hessling (13. Apr 2017)

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 (13. Apr 2017)

Holger_Hessling hat gesagt.:


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


----------



## Holger_Hessling (13. Apr 2017)

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


----------



## mrBrown (13. Apr 2017)

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?


----------



## Holger_Hessling (13. Apr 2017)

Okay, Danke! Da ist der Haken!

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


----------



## mrBrown (13. Apr 2017)

Holger_Hessling hat gesagt.:


> Okay, Danke! Da ist der Haken!
> 
> Nein, der Thread ist absolut unwichtig, aber er bleibt im Taskmanager unter Windows sichtbar.



Dann guck dir mal https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setDaemon-boolean- an


----------



## Holger_Hessling (13. Apr 2017)

Cool!!!!!!! Danke!!!!!!!!


----------



## JuKu (18. Apr 2017)

Holger_Hessling hat gesagt.:


> Hab's gelöst - einfacher und ohne den ShutdownHook! Habe eine Methode hinzugefügt, mit der ich alive = false setzen kann.
> 
> ```
> public class MyTask implements Runnable {
> ...



So etwas gibt es schon!
Die Methode nennt sich *isInterupted()*.

```
Thread.currentThread().isInterupted()
```


----------



## mrBrown (18. Apr 2017)

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


----------

