AWT Threads richtig beenden! Wie?

Status
Nicht offen für weitere Antworten.
S

Starbuck1865

Gast
Hallo,

ich hab hier ein kleines Problem, wenn ich in meinem AWT Hauptprogrammfenster einen Button drücke, erzeuge ich einen neuen Thread mit einem kleinen AWT Fenster (Die Klasse die in dem Thread instanziert wird, erbt also von Frame und implementiert runnable). In der run() Methode des Threads ist eine Endlosschleife die nach bestimmter Zeit ein repaint auslöst.
Wenn das Fenster geschlossen wird, soll über die WindowsClosing() Methode auch der Thread richtig beendet werden.
Meine Frage ist, wie mache ich das richtig. Denn bisher habe ich es nur geschafft, den Thread in den suspend Modus zu bringen. Das meint jedenfalls der Debugger vom Eclipse.
Aber dann ist der ganze Speicher ja noch nicht freigegeben, oder?

Meine WindowClosing Methode und run Methode();

Code:
public void windowClosing ( WindowEvent e)
{ 
				    	  
				    	  			    	  
	e.getWindow().setVisible(false);
	e.getWindow().dispose();	
				    	  
}

public void run()
{
    do
   {
	 try
         {
		            	
		 Thread.sleep(100);
		 repaint();
         }
        catch(InterruptedException interruptedexception)
	{
		            	
	}
		            
   }
   while(true);
			
}

Ich hab auch schon mit thread.stop experimentiert, oder versucht die Endlosschleife mit einem interrupt zu unterbrechen. Beides hat auch blos zum suspend des Threads geführt.

Muss ich eventuell in der WindowClosed() Methode noch irgendwas freigeben? Aber die kann ja eigentlich gar nicht mehr erreicht werden, wenn der Thread, welcher das Frame beherbergt geschlossen wird.
Und müsste nicht der Carbage Collector mit dem Müll aufräumen der da suspended ist?


nach schließen des Threads, zeigt mir der Eclipse Debugger folgendes an:

Thread [Thread-4] (Suspended (exception NullPointerException))
SignalMonitor.paint(Graphics) line: 225
SignalMonitor.repaint() line: 237
SignalMonitor.run() line: 197
Thread.run() line: 595


Vielen Dank für Hilfe im voraus
 

Mag1c

Top Contributor
Hi,

erst ein Flag setzen, damit der Thread weiß, daß er sich beenden soll (muß dann dort beim while(true) rein).
Dann den Thread unterbrechen thread.interrupt(), falls der sich gerade im sleep(...) befindet.
Damit sollte der Thread sicher beendet sein und du kannst das Fenster schließen.

Gruß
Mag1c
 
S

Starbuck1865

Gast
Hallo Mag1c,

du meinst also ich soll die run() Methode so schreiben:

Code:
public void run()
{
			
		       do
		       {
		    	   
		            try
		            {
		            	Thread.sleep(100);
		                repaint();
		            }
		            catch(InterruptedException interruptedexception)
		            {
		            	Thread.currentThread().interrupt();
		            }
		            
		       }
		       while(!Thread.currentThread().isInterrupted());
			
}

und am Anfang der WindowClosing() ein Thread.currentThread().interrupt(); einfügen.

Das habe ich schon ausprobiert, führt zu dem gleichen Ergebnis. Thread wird nur suspended.
Ich denke mal, dass das in meinem Program gar nichts bewirkt. Liegt vielleicht daran, dass ich nur runnable implementiere und nich direkt von Thread ableite.
 
B

Beni

Gast
Mag1c hat gesagt.:
erst ein Flag setzen, damit der Thread weiß, daß er sich beenden soll (muß dann dort beim while(true) rein).
:arrow:
Code:
public class IrgendeinThread extends Thread{
  private boolean flag = false;

  public void run(){
     while( !flag ){
        // irgendwas machen
     }
  }

  public void friendlyStop(){
    flag = true;
    this.interrupt();
  }
}
 
S

Starbuck1865

Gast
Okay danke, hab mein Fehler gefunden.

Ich hab den interrupt immer in der WindowClosing() direkt vorm dispose geschickt. Das ging anscheinend nicht. Jetzt hab iihn in die WindowClosed() geschrieben und es funzt. Juhuu!
 
G

Guest

Gast
Halt Stop,

war quatsch was ich eben geschrieben habe. Ich hab jetzt zwar ne Lösung gefunden und das Prolem erkannt aber meine Lösung is noch nicht zufriedenstellend.

Folgends hab ich gemacht, damit es klappt:

Code:
public class SignalMonitor extends Frame
	implements Runnable
{

private boolean interruptflag = false;
boolean threadfertig=false;

public SignalMonitor()
{
					
		addWindowListener( new WindowAdapter() 
		{
				    
			public void windowClosing( WindowEvent e ) 
			{ 
				    	  
				
				interruptflag = true;
				Thread.currentThread().interrupt();
						  
						  
				while(true)
				{
					 if(threadfertig)
					{
						e.getWindow().setVisible(false);
						e.getWindow().dispose(); 
						break;
					}
							  
				}
			}
								
			});

....
}

public void run()
{
			
       do
       {
		    	   
	     try
	     {
		      Thread.sleep(100);
		       repaint();
	     }
	     catch(InterruptedException interruptedexception)
	     {
		       interruptflag=true;
	      }
		            
      }
      while(!interruptflag);    
			
      threadfertig=true;
}

Das es jetzt funzt lag wohl daran, dass ich vorher immer direkt nach dem ich das flag oder den interrupt in der Windowclosing Methode gesetzt habe, das dispose aufgerufen hatte. Der Thread war aber zu diesem Zeitpunkt noch nicht richtig beendet und es gab den Fehler. Das hab ich jetzt mit der Hilfsvariable threadfertig gelöst, auf deren true zustand ich in WindowClosing warte, um danach zu disposen

Okay das mag ne Lösung sein, aber das ist sicher nicht im Sinne des Erfinders. Also kann mir vielleicht einer weiterhelfen, und zeigen wies richtig geht?
 

Mag1c

Top Contributor
Aeh,

ich vermisse noch den Thread. Wo erzeugst du den ?

Mit Thread.currentThread().interrupt() unterbrichst du den gerade laufenden Thread, was IMHO keinen Sinn ergibt, da der gerade laufende Thread dabei ist sich selbst zu unterbrechen :bae:
Du mußt dem SignalMonitor eine Referenz auf den erzeugten Thread geben, damit dieser beim Schließen des Fensters beendet werden kann. Das threadfertig Flag kannst du wieder rausschmeißen. Das kann man mit Thread#join erledigen.

Und: Design-technisch würde ich diesen Thread (oder ein Runnable) als inner Class implementieren und den Thread per Methode setAutoUpdate(boolean) oder ganz automatisch bei setVisible(boolean) aktivieren bzw. deaktivieren.

Gruß
Mag1c
 
S

Starbuck1865

Gast
Ich erzeuge den Thread in einem anderen Frame. Wenn ich den entsprechenden Button drücke. Also die Erzeugung liegt im Ereignisbehandler des Buttons. Wie übergebe ich den jetzt eine Referenz an die andere Klasse bzw. den Thread. Und ist nicht currentThread das selbe, als wenn ich ne Referenz von dem Thread übergebe. Ich will ja gerade, über die WindowClosing() des Threads, den selben aus seinem Schlaf holen und beenden.
 

Mag1c

Top Contributor
Hi,

dein erzeugter Thread tut genau das, was du ihm in der run()-Methode vorgegeben hast, nämlich in einer Schleife eine kurze Pause einlegen und anschließend das Frame neu zeichnen. Sonst nix!
Das Fenster schließen bzw. der Aufruf des WindowListeners wird durch den AWTEventThread durchgeführt.

Du könntest per set-Methode nach dem Erzeugen den Thread setzen. Aber das wäre nur eine weitere Krücke. Ich habs ja im letzten Post schon geschrieben. Mach den Thread komplett in den SignalMonitor rein. Nach außen hin ist das völlig uninteressant, wie du die Aktualisierung der Anzeige vornimmst.

Gruß
Mag1c
 
S

Starbuck1865

Gast
Okay es läuft. Ich hab den Thread, wie du es mir geraten hast, in einer inneren Klasse definiert. Damit kam der Interrupt an und alles ist wunderbar.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
x46 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
P 4 Threads in einer Methode Allgemeine Java-Themen 2
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
OnDemand Threads und synchronized Allgemeine Java-Themen 9
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
OnDemand Threads und synvhronized Allgemeine Java-Themen 2
S Problem mit Threads Allgemeine Java-Themen 1
W Threads Threads warten lassen Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
M Threads Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
O Threads und If Befehle Allgemeine Java-Themen 7
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
C Threads und Exceptions Allgemeine Java-Themen 7
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
E Threads Sudoku Threads Allgemeine Java-Themen 8
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
Gossi Threads mit unterschiedlichen Aufgaben in einer Klasse? Allgemeine Java-Themen 9
G Threads Ablauf von Threads im Spezialfall Allgemeine Java-Themen 4
V Threads bei quadcore Allgemeine Java-Themen 10
V 1000 Threads oder Iterativ? Allgemeine Java-Themen 11
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
B Threads Game of Life - Threads Allgemeine Java-Themen 49
R Threads Exceptions von Threads abfangen im ThreadPool Allgemeine Java-Themen 5
S Threads Ende sämtlicher Threads abwarten Allgemeine Java-Themen 6
S Frage zu Threads (Sichtbarkeit und Verhalten) Allgemeine Java-Themen 11
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
P Threads- Programming Allgemeine Java-Themen 2
G Threads Klasse Sound und Threads bleiben hängen Allgemeine Java-Themen 4
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
M Threads dauerhafte bewegung mit threads Allgemeine Java-Themen 11
frankred Threads Auf eine Gruppe von Threads warten Allgemeine Java-Themen 11
J Eure Meinung: Threads verwenden, oder nicht? Allgemeine Java-Themen 6
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
O Wie kann ich das Ende eines Threads melden? Allgemeine Java-Themen 7
J Writer und Threads Allgemeine Java-Themen 2
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
E Verständnisfrage bezüglich Threads Allgemeine Java-Themen 4
K Zeitkritische Threads Allgemeine Java-Themen 14
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8
S [THREADS] Thread sinnvoll beenden Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben