Thread beenden

Diskutiere Thread beenden im Plattformprogrammierung Forum; Es geht um folgendes Runnable: public class MyTask implements Runnable { private Boolean alive; @Override public void run() { alive =...

  1. Holger_Hessling
    Holger_Hessling Mitglied
    Es geht um folgendes Runnable:
    Code (Text):

    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 (Text):
    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?
     
  2. Vielleicht hilft dir das kostenlose Training weiter --> (hier klicken)
  3. mrBrown
    mrBrown Bekanntes Mitglied
    Wird der Shutdown-Hook nicht aufgerufen oder wird nur die Schleife nicht verlassen, das kann auch noch eine andere Ursache haben?

    BTW: Warum Boolean?
     
  4. Holger_Hessling
    Holger_Hessling Mitglied
    Es wird der ShutdownHook nicht gestartet!

    Du meinst, warum Boolean und nicht boolean?
     
    Zuletzt bearbeitet: 13. Apr. 2017
  5. mrBrown
    mrBrown Bekanntes Mitglied
    Wie beendest du denn das Programm?
    Ja
     
  6. Holger_Hessling
    Holger_Hessling Mitglied
    Hab's gelöst - einfacher und ohne den ShutdownHook! Habe eine Methode hinzugefügt, mit der ich alive = false setzen kann.
    Code (Text):

    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 (Text):

        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!!!
     
  7. mrBrown
    mrBrown Bekanntes Mitglied
    Das Problem vorher war, das dein Programm nicht beendet wurde, nur der JavaFX-Thread wurde beendet.


    Ersparte dir zumindest eine Fehlerquelle...
     
  8. Holger_Hessling
    Holger_Hessling 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
     
  9. mrBrown
    mrBrown Bekanntes Mitglied
    An dem Satz ist doch aber nichts falsch oder missverständlich?
     
  10. Holger_Hessling
    Holger_Hessling Mitglied
    Hm? Mein Platform.exit(); führt doch zu einem normalen Programmende, oder nicht?
     
  11. mrBrown
    mrBrown Bekanntes Mitglied
    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?
     
  12. Holger_Hessling
    Holger_Hessling Mitglied
    Okay, Danke! Da ist der Haken!

    Nein, der Thread ist absolut unwichtig, aber er bleibt im Taskmanager unter Windows sichtbar.
     
  13. mrBrown
    mrBrown Bekanntes Mitglied
  14. Holger_Hessling
    Holger_Hessling Mitglied
    Cool!!!!!!! Danke!!!!!!!!
     
  15. JuKu
    JuKu Mitglied
    So etwas gibt es schon!
    Die Methode nennt sich isInterupted().
    Code (Java):
    Thread.currentThread().isInterupted()
     
  16. mrBrown
    mrBrown Bekanntes Mitglied
    Das ist doch auch das falsche dafür...den Thread kann man auch einfach sterben lassen
     
  17. Schau dir jetzt hier den Kurs an und lerne Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)
Die Seite wird geladen...

Thread beenden - Ähnliche Themen

Thread der auf eine Queue wartet, sicher beenden
Thread der auf eine Queue wartet, sicher beenden im Forum Java Basics - Anfänger-Themen
Doppelte Threads beenden
Doppelte Threads beenden im Forum Java Basics - Anfänger-Themen
ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec
ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec im Forum AWT, Swing, JavaFX & SWT
Threads beenden
Threads beenden im Forum Allgemeine Java-Themen
Start des zweiten Threads erst nach Beenden des ersten Threads
Start des zweiten Threads erst nach Beenden des ersten Threads im Forum Allgemeine Java-Themen
Thema: Thread beenden