javax.exe beenden nach Programmende

c_sidi90

Top Contributor
Ich weiss ist ne blöde Frage, doch ich wunder mich gerade wieso sich die javax.exe immernoch im Taskmanager befindet wenn ich meine Applikation beende. Sie wirft keine Exceptions und abundzu wird das Programm auch im Taskmanager geschlosen nur teilweise auch nicht. Wer kann mir eine mögliche Ursache nennen?
 
Wenn java.exe noch im Taskmanager erscheint, läuft das Programm noch.
Wie beendest du deine Applikation?
 
Durch schließen des Fensters. JFrame.EXIT_on_Close, teilweise wird der Prozess auch gekillt nur halt leider "teilweise" was unvorteilhaft bei einer Netzwerkapp ist.
 
Hallo,

hast du es schon mal statt mit
Code:
JFrame.EXIT_on_Close
mit einem WindowAdapter und dort in der Methode
Code:
windowClosing
ein
Code:
System.exit(0);
probiert?
Dort kannst du auch noch evtl. Abschluß-Methoden (z. B. Abmeldung von Datenbank usw.) ausführen lassen, bevor das Programm beendet wird.

MfG
hansmueller
 
Ja habe ich versucht, ist aber kein Unterschied. Und ja ich habe einen Thread am laufen. Aber dieser sollte sich doch terminieren wenn ich das Programm schließe, tut er ja auch teilweise.
 
System.exit sollte man nur in Notfällen nutzen meiner Meinung nach und zwar genau dann, wenn man einen speziellen Exit-Code braucht. Als generelles Mittel zum Zweck ist es nicht gedacht.
Wenn ein GUI Programm sich nicht beenden mag, ist ein Programmierfehler drin!


Ja habe ich versucht, ist aber kein Unterschied. Und ja ich habe einen Thread am laufen. Aber dieser sollte sich doch terminieren wenn ich das Programm schließe, tut er ja auch teilweise.

Nicht immer. Erstens muss der Prozess so eingestellt sein, dass er sich beim Programmende automatisch beendet und zweitens geht das auch nur, wenn du z.B. sauber beendest.

Am Besten arbeitet man mit Threads wenn man der Klasse (z.B. dem Runnable) eine Methode "shutdown" mit gibt welche dem Thread sagt "bitte mach mal noch fix die Arbeit fertig und geh dann an einem Safepoint aus".

Dieser Safepoint könnte z.B. die gerade zu bearbeitende Transaktion oder ähnliches sein.

Einen Thread abschießen ist immer unschön.

Java:
class Task implements Runnable{
  private final AtomicBoolean stop = new AtomicBoolean(false);

  public void run() {
    for (int i = 0; i < 100000; i++) {
      Transaction transaction = Transaction.begin();
      try {
        ... long work
        transaction.commit();
      } catch (Exception) {
        transaction.rollback();
      }
     
      // Safepoint weil Transaction durch
      if (stop.get()) {
        return;
      }
    }
  }

  public void shutdown() {
    stop.set(true);
  }

}
 
Zuletzt bearbeitet:
Und wie schauts aus wenn der Thread durchgehend laufen muss, bis das Programm wirklich beendet wird durch das "X" ? Er hat keine Zeitliche Einschränkung, dass Abbruchkriterium ist das Programmende.
 
Hab oben mal nachbearbeitet. Du rufst im Close-Handler die Methode shutdown() des Tasks auf und dieser sucht den nächsten Safepoint und beendet sich dann. Im schlimmsten Fall hast du bei dieser Methode einen Thread der ein paar Sekunden länger läuft als der Rest des Programms bevor er ausgeht. Dafür hast du sichere Datenkonsistenz.
 

Zurück
Oben