Wie kann ich einen schlafenden Thread stoppen?

IZZO

Mitglied
Wenn der eine Button (ourredbuff) angeklickt wird, dann startet in einem JTextField ein Countdown. Wenn jetzt der andere Button angeklickt wird (intredbuff) dann soll der Thread mit dem Countdown unterbrochen werden. Dort ist aber Thread.sleep() eingebaut welches nciht unterbrochen wird.

Hier die Fehlermeldung:
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at mainPack.Countdown.<init>(Countdown.java:50)
at mainPack.Hauptklasse$6.run(Hauptklasse.java:129)

Hier der Code:
Java:
 public void actionPerformed(ActionEvent e) { 
		 
	        if(e.getSource() == ourredbuff){ 
	        	
	        	 cd1 = new Thread() {
	        		public void run() { new Countdown(orb,5,0);}
	        	};
	        	
	        	if(cd1.isAlive() == false){
		            cd1.start();
	        	}
	        }
	        
	       
	            
	        if(e.getSource() == intourredbuff){
	        	
	        	if(cd1.isAlive() == true){
	        		cd1.interrupt();
	        	}
	        	
	        	
	
	        }
}
 

sheel

I love Asm
Ich sags dir noch einmal, auch wenn du es nicht hören willst:
Deine Methode ist Quatsch.

Wenn du die vorgechlagenen Sachen umsetzt gibt es überhaupt keine Probleme.
Falls du das (noch) nicht kannst ist da einfach Nachholbedarf.
Ohne irgendein Wissen über Synchronisation braucht man einen Thread gar nicht erst starten.

edit: Lies zusätzlich einfach mal im Detail nach, was interrupt macht.
 

benhaze

Mitglied Platinum
Das Problem ist die Verwendung der Klasse Thread bzw. dessen Instanz.
Die Run-Method wird quasi in/von einem neuen Thread asynchron ausgeführt.

Du solltest diese Methode sinnvoll implementieren.
Wenn diese Methode (ich sag mal) *durchgelaufen* ist, ist der Thread beendet.

Vor allem, schaue dir mal deinen Code Zeile für Zeile an:
Code:
cd1 = new Thread() {
   public void run() { new Countdown(orb,5,0);}
};
                
if(cd1.isAlive() == false){
   cd1.start();
}
1. Mit NEW erstellst du ein neues Object cd1.
2. Anschließend wird dieses neue Objekt gefragt, ob es Alive() ist.

Wozu?
Warum sollte es Alive() sein?
Du hast es doch gerade erst erstellt.

Es ist auch nicht klar wie die Klasse Countdown implementiert ist.
Das wäre deinem Code zufolge hier sehr wichtig.
 
Zuletzt bearbeitet:

IZZO

Mitglied
Danke für diesen konstruktiven Beitrag benhaze!! Ich habe das Problem allerdings schon gelöst. Danke trotzdem.