Timer bei Programmende beenden

Status
Nicht offen für weitere Antworten.

Piwi

Mitglied
Hallo zusammen,

ich starte in einem Programm automatisch einen Timer, der alle 10 Sekunden neue Bilder erzeugt und diese in einem Ordner abspeichert.

Problem: Wenn ich in Eclipse das Programm über die Konsole (rotes Quadrat) beende, läuft der Timer munter weiter und erschafft weiter Bilder. Ich muss den entsprechenden Prozess dann immer mühselig über den TaskManager beenden.

Frage: Wie schaffe ich es nun, dass der Timer-Thread auch mit Programmende automatisch beendet wird?

Codeschnipsel:


Java:
public void startTimer(Graphics2D g) {
	long delay = 1000*10;
	WriteTask wt = new WriteTask(this, g);
	Timer t = new Timer();
	t.schedule(wt, 0, delay);
}

Vielen Dank im Voraus
 

angelchr

Mitglied
Hallo,

hast du die default close operation gesetzt? Könnte daran liegen.
Java:
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
S

SlaterB

Gast
hast du ein vollständiges Testprogramm?
mit einem Dummy-Timer, der nur Zeit verbraucht, nicht unbedingt irgendwas gefährliches macht,

ich hatte mit dem roten Knopf bisher keine Probleme, schließt wirklich alles,

auch sollte nur bei Timern/ Threads nur ein Eintrag pro Programm im TaskManager zu sehen sein,
wieviele sind es bei dir vor/ nach dem roten Knopf? schließt der wenigstens eins/ ein paar davon oder passiert gar nix?
 
Zuletzt bearbeitet von einem Moderator:

Piwi

Mitglied
Also ich habe nach dem Start zwei Prozesse laufen: "javaw.exe" und "java.exe". Nach dem Beenden über das rote Quadart in Eclipse schließt sich "javaw.exe" automatisch. "java.exe" läuft weiter und muss immer manuell beendet werden.

Es gibt beim Timer die Methode cancel(). Vielleicht hilft es, diese aufzurufen. Aber ich weiß leider nicht, wie man an das Ergeignis herankommt, wenn das rote Quadrat eben gedrückt wird.

Unten mal ein Programm, das nichts weiter tut als einen Timer zu starten, der alle 10 Sekunden das TimerTask tt (welches auch nichts tut) ausführt.

Java:
public void startTimer() {
    long delay = 1000*10;
    TimerTask tt = new TimerTask();
    Timer t = new Timer();
    t.schedule(tt, 0, delay);
}

public static void main(String args[]) {
    startTimer();
}
 

Piwi

Mitglied
Ich nehme an, dass der zweite Prozess zu dem TimeerThread gehört... Weil der Timer bei mir erst aufhört zu arbeiten, wenn ich den Prozess auch beende...
 

Michael...

Top Contributor
Der zweite Prozess muss irgendwie gestartet werden, und das passiert normaler weise nicht durch starten eines Timers. Poste doch mal Dein Programm - aufs wesentliche gekürzt.
 

Piwi

Mitglied
Ok, also hier die wesentlichen Teile:

Die Klasse WriteTask:

Java:
public class WriteTask extends TimerTask {
	
	AwarenessImage ai;
	Graphics2D g;
	public String path_tree_withered = "build/pics/withered150_200.gif";
	public String path_flower_withered = "build/pics/flower_withered.gif";
	File file_tree_withered;
	File file_flower_withered;
	int count = 0;
	
	public WriteTask(AwarenessImage awarenessImage, Graphics2D graphics) {
		super();
		ai = awarenessImage;
		g = graphics;
		file_tree_withered = new File(path_tree_withered);
		file_flower_withered = new File(path_flower_withered);
	}

	public void run() {
		
		try {
			ai.wither(g, path_flower_withered, path_tree_withered);
			ImageIO.write(ai, "png", new File("build/pics/awarenessimage/ai" + count + ".png"));
			count++;
		}
		catch (IOException e) {
			System.out.println("Fehler beim Schreiben des Bildes!");
		}
	}
}

Die Klasse AwarenessImage (hier wird das Bild erzeugt, welches der Timer letztendlich mithilfe des WriteTasks abspeichert)

Java:
public class AwarenessImage extends BufferedImage {

        public String elvinURI;
	
	public ArrayList<BildimBild> bilder;
	
	public AwarenessImage() {
		super(800, 600, BufferedImage.TYPE_INT_ARGB);
		init();
		createBild();
	}
	
	public AwarenessImage(int w, int h, int type) {
		super(w,h,type);
		init();
		createBild();
	}
	
	public void init() {
		bilder = new ArrayList<BildimBild>();
                elvinURI = System.getProperty("elvin", "elvin://127.0.0.1");
	}
	
	public void startTimer(Graphics2D g) {
		long delay = 1000*10;
		WriteTask wt = new WriteTask(this, g);
		Timer t = new Timer();
		t.schedule(wt, 0, delay);
	}
	
	public void createBild() {
		
		final Graphics2D g = this.createGraphics();
		g.setColor(new Color(0, 92, 15));
		g.fillRect(0, 0, 800, 600);
		
		try {
			Elvin elvin = new Elvin(elvinURI);
			elvin.closeOnExit();
                        startTimer(g);
                        Subscription s1 = elvin.subscribe("group == 'awareness' && eventsubtype == 'create'");
                        Subscription s2 = elvin.subscribe("group == 'awareness' && eventsubtype == 'delete'");
                        Subscription s3 = elvin.subscribe("group == 'awareness' && eventsubtype == 'update'");
            
                        s1.addListener(new CreateEventListener(this, g));
                        s2.addListener(new DeleteEventListener(this, g));
                        s3.addListener(new UpdateEventListener(this, g));
                    }
                    catch (Exception e) {
			System.out.println("Fehler beim Herstellen der Verbindung!");
		}
		


	}
	
	public void wither(Graphics2D g, String s1, String s2) {
		
		Iterator<BildimBild> it = bilder.iterator();	
		while (it.hasNext()) {
			BildimBild bib = (BildimBild) it.next();
			long old_time = bib.getTime();
			long now_time = new Date().getTime();
			if (now_time - old_time > 30000) {
				int[] pos = bib.getPosition();
				g.setColor(new Color(0, 92, 15));
				g.fillRect(pos[0], pos[1], pos[2], pos[3]);
				if(bib.isFile())
					bib.setImage(s1);
				else
					bib.setImage(s2);
				bib.rescale();
				g.drawImage(bib.getImage(), pos[0], pos[1], null);
			}
			
		}

Gestartet wird in folgender Klasse:

Java:
public class AwarenessImageCreator {
	
	public static void main(String[] args) {
		AwarenessImage ai = new AwarenessImage();
	}

}
 

Dissi

Aktives Mitglied
Schau mal in deinem JDK ordner/bin, da gibts "jvisualvm".

Damit kannst du alle offenen Java Anwendungen monitoren und sehen, welche Threads laufen etc.
 

Piwi

Mitglied
Der zweite Prozess muss irgendwie gestartet werden, und das passiert normaler weise nicht durch starten eines Timers. Poste doch mal Dein Programm - aufs wesentliche gekürzt.

So, ich habe jetzt mal den Timer durch einen Thread ersetzt, der alle zehn Sekunden das macht, was vorher der Timer gemacht hat. Das Problem bleibt dennoch bestehen: Nach dem Beenden über das rote Quadrat arbeitet mein Thread munter weiter...

Liegt es vielleicht daran, dass ich über Ant zwei Targets ausführe und er beim Beenden über das rote Quadrat nur eines davon beendet? Wie komme ich dann an das zweite ran, damit die JVM samt des Threads endlich auch beendet wird?
 
S

SlaterB

Gast
sollte dennoch den roten Button von Eclipse nicht aufhalten,
falls mehrere Programme gestartet wurden, darf man auch ruhig mehrmals klicken
 
S

SlaterB

Gast
nach google-Suchen funktionieren ShutdownHook nicht,
Is it possible for Eclipse to terminate gently instead of using SIGKILL? - Stack Overflow
How to send a kill signal from Eclipse?

aber dass Threads weiterlaufen habe ich bisher noch nicht gehört oder erlebt,
gibts da empirischen Nachweise oder Dokumentation?

wenn ich ein Testprogramm wie
Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        for (int i = 0; i < 3; i++)
        {
            final int finalI = i + 1;
            Runnable r = new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            Thread.sleep(finalI * finalI * 1000);
                            System.out.println("dran " + finalI);
                            new File("aTest" + finalI + ".txt").createNewFile();
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                };
            new Thread(r).start();
        }
    }
}
laufen lasse, und nach 5 sec beende, dann werden die Dateien nach 1 + 4 sec erzeugt, nicht aber die des dritten Threads,
von Konsolenausgaben ganz zu schweigen,

in jedem Fall wird unter Windows nur ein java.exe-Prozess im TaskManager angezeigt und auch beendet wenn man den Button klickt,
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
??
was ist das denn für eine Aussage, es geht doch darum wie der Eclipse-rote-Button reagiert,
wie kann da Thread#setDaemon etwas aussagen?

wenn ich in meinem Beispiel die drei Threads als Daemon setze ist mit der main das Programm sofort beendet, keine Datei wird erzeugt,
ansonsten wie bisher: es werden Dateien erzeugt je nachdem wann man den Button drückt,
kein Thread läuft danach noch alleine weiter
 

Piwi

Mitglied
Leider haben obige Tipps nichts geholfen. Ich habe mir das Problem jetzt nochmal genau angeschaut. Ich führe über Ant zwei Targets aus, die natürlich unterschiedliche Main-Methoden aufrufen, also zwei Programme starten.

Beide Targets erzeugen jeweils zwei Prozesse "java.exe" und "javaw.exe". Der Rote Button terminiert nur einen der "javaw.exe" Prozesse, d.h. drei Stück laufen danach immer noch weiter und müssen von mir weiterhin manuell beendet werden... :(
 
S

SlaterB

Gast
erstaunlich dass der rote Button überhaupt mit einem der Targets verknüpft ist,
von Ant hattest du bis gestern nichts geschrieben,

wenn Eclipse ein Ant-Skript ausführt und das wer weiß was anstellt, wie soll Eclipse darüber die Kontrolle behalten?
so eng sind die beiden nicht verknüpft, zumindest standardmäpig nicht, vielleicht schreibt wer ein schlaueres Plugin für Eclipse
(alles nur Vermutungen, kenne die internen Eclipse-Details nicht)


auch aus einem der Java-Programme wirst du wenig Möglichkeiten haben,
auf andere parallel laufende Java-Programme Einfluss zu nehmen


ist es überhaupt dein Ziel, 2-4 parallele Programme zu starten?
poste doch bisschen mehr zum Sinn des ganzen,
die entscheidenen Ant-Passagen usw.
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
??
was ist das denn für eine Aussage, es geht doch darum wie der Eclipse-rote-Button reagiert,
wie kann da Thread#setDaemon etwas aussagen?

wenn ich in meinem Beispiel die drei Threads als Daemon setze ist mit der main das Programm sofort beendet, keine Datei wird erzeugt,
ansonsten wie bisher: es werden Dateien erzeugt je nachdem wann man den Button drückt,
kein Thread läuft danach noch alleine weiter
Denk ich habe an dir vorbeigeredet SlaterB, das von mir erklärte Verhalten betrifft ndie Threads nur solange sie schlafen und hat natürlich nix mit dem Eclipse Debugger zu tun.
 
S

SlaterB

Gast
Debugger ist immer noch was anderes, es geht vom ersten Posting an nebenbei um den roten Button in der Eclipse-Konsole,
der laufende Programme beendet
 

Piwi

Mitglied
ist es überhaupt dein Ziel, 2-4 parallele Programme zu starten?

Nein, das ist es eigentlich nicht. Danke für diesen (eigentlich sehr offensichtlichen) Tipp. Brauche nun keine zwei Targets mehr, sondern starte das Programm nunmehr über ein Target. Aber das "Rote-Button-Problem" bleibt leider weiterhin bestehen. :( Der zugehörige java.exe-Prozess schließt sich nicht nach dem Klicken auf den roten Button, wenn ich über Ant ausführe.

Starte ich das Programm direkt aus Eclipse heraus, hat sich das Problem jedoch erledigt. Zumindest mal ein Teilerfolg :)

Hier das zugehörige Ant - Target:
Code:
<target name="FileSystemSensor" depends="compile">
	  <java fork="yes" classname="de.unibw.awareness.sensor.filesystem.system.FileSystemSensor" 
	            classpathref="exec.classpath" maxmemory="256m">
	  </java>
</target>
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
E multiple Timer die sich nicht summieren Java Basics - Anfänger-Themen 12
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
C Timer aktualisieren Java Basics - Anfänger-Themen 5
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
missy72 Timer oder Timeline Java Basics - Anfänger-Themen 3
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
D Änder der Timer Speeds Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
L Methoden Timer Java Basics - Anfänger-Themen 9
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
S Timer reseten Java Basics - Anfänger-Themen 3
T Timer stoppt zu früh Java Basics - Anfänger-Themen 7
CptK Methoden Timer & Mathematischer Denkfehler Java Basics - Anfänger-Themen 7
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
D Timer programmieren Java Basics - Anfänger-Themen 13
N Timer funktioniert nicht beim starten Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
J Timer richtig pausieren Java Basics - Anfänger-Themen 2
E Timer erstellen Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
S actionlistener timer Java Basics - Anfänger-Themen 9
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
S timer mit imagedatei Java Basics - Anfänger-Themen 5
S timer Java Basics - Anfänger-Themen 0
V Java Uitil Timer Stoppt nicht Java Basics - Anfänger-Themen 2
KaffeeFan Timer beenden Java Basics - Anfänger-Themen 12
K Ampelsteuerung mit Timer Java Basics - Anfänger-Themen 8
F Array und Timer Java Basics - Anfänger-Themen 2
G Timer einsetzen Java Basics - Anfänger-Themen 2
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T Timer - HILFE Java Basics - Anfänger-Themen 10
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Schneller Timer Java Basics - Anfänger-Themen 2
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
B Timer beenden? Java Basics - Anfänger-Themen 0
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
O Delayed Timer erstellen Java Basics - Anfänger-Themen 3
M Timer / Thread Java Basics - Anfänger-Themen 43
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
A Timer: textarea.getText() mit Variable vergleichen Java Basics - Anfänger-Themen 3
D Problem mit Methode und Timer Java Basics - Anfänger-Themen 35
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
R Einfacher Timer geht nicht Java Basics - Anfänger-Themen 7
J Swing Timer Java Basics - Anfänger-Themen 3
M Einfacher Timer ;) Java Basics - Anfänger-Themen 15
M Timer für Termial-Eingaben Java Basics - Anfänger-Themen 3
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
B Timer Java Basics - Anfänger-Themen 25
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
S Erste Schritte Java Timer Java Basics - Anfänger-Themen 13
E Threads Timer Java Basics - Anfänger-Themen 6
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
L Erste Schritte Timer und Zugriffsattribute Java Basics - Anfänger-Themen 5
M Audio + Timer Java Basics - Anfänger-Themen 12
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
R Klassen MemorySpiel: brauche Timer Java Basics - Anfänger-Themen 3
D Timer in Applet Java Basics - Anfänger-Themen 2
ruerob Warum ist Timer schneller als While? Java Basics - Anfänger-Themen 9
F Java Timer Frage Java Basics - Anfänger-Themen 14
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
B Timer Java Basics - Anfänger-Themen 2
S timer task problem Java Basics - Anfänger-Themen 2
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
S "Kleines" Problem mit dem Timer Java Basics - Anfänger-Themen 4
Luk10 Problem mit vielen Timer(-Events) Java Basics - Anfänger-Themen 17
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
W Timer erstellen Java Basics - Anfänger-Themen 2
M Timer: period während Verlauf wechseln Java Basics - Anfänger-Themen 12
M Timer unterbrechen? Wo ist mein Thread? Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
P Java Timer Java Basics - Anfänger-Themen 2
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
B problem mit timer/timertask, Farbverlauf Java Basics - Anfänger-Themen 10
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
kulturfenster Problem mit javax.swing.Timer Java Basics - Anfänger-Themen 2
C Regelmäßigen Timer bei Zeitüberschreitung nacheinander abarbeiten Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
H Timer Java Basics - Anfänger-Themen 3
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
G Klasse mit Timer nicht beenden Java Basics - Anfänger-Themen 6
S Timer / TimerTask Frage Java Basics - Anfänger-Themen 8
S Timer bzw. TimerTask Frage Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben