Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Programm stoppen - Zustand speichern - später fortführen
1.)
Ich starte ein Programm welches Berechnungen ausführt, die sehr viel Zeit in Anspruch nehmen.
Wie kann ich das Programm abbrechen, den Zustand speichern, und zu einem späteren Zeitpunkt fortführen?
Da gibt es doch bestimmt etwas "fertiges" das zur Verfügung steht, oder muss ma sich das selbst "zusammenbasteln"?
2.)
Wie kann ich, wenn ich das Programm manuell abbreche, eine bestimmte Methode (bisherige Ergebnisse ausgeben) aufrufen?
Geht das mit:
Java:
DO
Ausführen
WHILE (!abbruch)
Wenn ja, wie müsste ich abbruch definieren? Oder gibt es einen eleganteren Weg?
Zu 1)
Du musst halt irgendwie deinen State persistieren. Normalerweise wird nicht das ganze Programm persistiert sondern nur deine Datenobjecte. Da kannst du dir dann aussuchen was du damit machen möchtest. Einfach serialisieren und wegschreiben, oder als XML ausgeben, oder in eine DB werfen. ist viel denkbar.
Beim erneuten Programmstart muss dan der letzte "Stand" aus dem serialisierten Stand geladen werden.
Zu 2) Ich würde eher
Java:
while(!userCanceled){
// do something
}
if(userCanceled){
// do something
return 1;
} else {
return 0;
}
aber das ist Geschmackssache, ich mag Do-While Schleifen nicht
Ich verstehe nicht ganz, wie ich registrieren kann, dass ich abgebrochen habe.
Ich breche immer in NetBeans mit dem roten Button neben der Ausgabe ab (Benutze keine GUI). Wie kann ich registrieren, dass das Programm abgebrochen wurde, um kurz vor dem Beenden noch ne Ausgabe zu machen? Es müsste doch eine Art Listener auch für derartige Programmabbrüche geben?
Das ist das Problem, NetBeans scheint ein SIGKILL zu senden, so daß der ShutdownHook nicht läuft. Du könntest die Berechnung in einen separaten Thread packen, eine JOptionPane anzeigen und bei deren return ein
Code:
System.exit(0);
. Dann läuft der ShutdownHook. Aber das ist irgendwie extrem schmuddelig.
Wenn Du viel rechnest, hast Du sicherlich eine oder mehr innere Schleifen. Im Allgemeinen packt man eine Abbruchbedingung (
Code:
boolean isCancelRequested
) in eine Variable, auf die beide Threads Zugriff haben und prüft in der/den innersten Schleife(n) auf Abbruch und erledigt das Persistieren des Zustands danach.
Naja entweder du benutzt jetzt halt doch eine GUI (kann ja nur Pseudo sein, irgendein kleines Frame damit du etwas hast wo du nen Listener dranhängen kannst), oder du startest dein Programm aus der Konsole heraus und startest einen einfachen Thread der eine Zeile von der Shell einliest. Das ist modal d.h. der Thread blockiert solange bis du etwas eingibst. Ein anderer Thread macht dann die Berechnungen. Sobald du dann Enter drückst oder meinetwegen irgendeinen Befehl eingibst, hält der eine Thread den anderen an, speichert die Daten ab und beendet dann das Programm (bzw verlässt einfach seine run-Methode)