Threads

H

Heidii

Gast
Hallo,

um mich mit dem Thema Threads zu befassen habe ich ein kleines Programm mit einem JButton (Start) geschrieben.

Gewünschte Funktion:
Erstes Mal auf den Button klicken:
der Text Start auf dem Button wird auf Beenden gewechselt.
Pro Sekunde wird ein Text ausgegeben.

Zweites Mal auf den Button klicken:
der Text Beenden auf dem Button wird auf Start gewechselt.
Die Textausgabe wird beendet.

Drittes Mal auf den Button klicken:
Alles beginnt wieder von vorne.

Hier mein Code (Auszug), der Fensterklasse mit dem JButton:
Java:
// Im Konstruktor lege ich eine Instanz vom Thread an:
Faden MFaden = new Faden();

	private class TheEvent implements ActionListener{

	
		public void actionPerformed(ActionEvent e) {
			
			if(pushed==false){
				Knopf1.setText("Beenden");
			        pushed = true;
				MFaden.start();
			}
			else{
				Knopf1.setText("Start");
				pushed = false;
			        MFaden.interrupt();				
			}			
		}
	}

Hier mein Code (Auszug) der Thread Klasse:
Java:
	public void run(){
		while(this.isInterrupted()==false){
		System.out.println("TEST");
		
		try {
			sleep(1000);
		} catch (InterruptedException e) {
			return;
		}	
	}
}

Folgendes ist das Problem: Wenn ich den Button einmal klicke funktioniert alles wie gewünscht. Auch wenn ich 2 Mal klicke funktioniert alles nach Plan.
Wenn ich ein 3tes mal klicke, dann sollte ich doch den Thread wieder von vorne starten, dies funktioniert aber nicht und ich kriege vom Compiler folgende Meldung:
Exception in thread "AWT-EventQueue-0

Ich denke ich starte den Thread korrekt, aber ich beende ihn irgendwie nicht richtig und aus diesem Grund kann ich ihn nicht neu starten.

Kann mir jemand sagen ob dies richtig ist, bzw. was die Compilermeldung zu bedeuten hat, bzw. was ich anpassen muss. Vielen Dank für alle Tipps schon jetzt.

Heidii
 
T

tröööt

Gast
also mit Thread.interrupt() einen thread von außen gewaltsam killen solltest du dir gar nicht erst angeöhnen ... das ist ganz schlechter stil und kann bei komplexen projekten zu großen problemen führen ...

deutlich besser wäre es wenn du ein flag nutzt auf welches im loop geprüft wird .. und welches von außen durch einen setter getoggled werden kann ... außerdem sollte man nicht mit return; aus run() aussteigen ... zumindest nicht ohne vorher sauber alles aufgeräumt zu haben ...


zum eigentlichen problem

so wie es aussieht hast du genau EIN thread objekt was EINMAL mit "new" erzeugt wurde ... und dieser wird auch genau ein mal gestartet ... und danach (gewaltsam) beendet ... und fertig ...

ein Thread hat folgenden lebenszyklus :

- created
- inited
- started
- RUNNING
- termianted

wenn ein thread TERMINATED erreicht hat ist er zu ende ... der thread ist durch ... also kann er nicht noch mal mit start() gestartet werden ...

du müsstest also eher sowas bauen

1ter klick : neuen thread erzeugen und temporär speichern ... > start()
2ter klick : thread sauber durch ein flag runterfahren ... nach stop (kann mit .wait() oder nem callback gemacht werden) alles aufräumen und die referenz auf NULL setzen ...
damit gibt man das objekt wieder frei und es kann vom GC aufgeräumt werden ...
3ter klick : wieder von vorne neuen thread erzeugen ...
 
H

Heidii

Gast
Hallo tröööt,

vielen Dank für deine Antwort! Werds gleich probieren.

Liebe Grüsse
Heidii
 
S

Spacerat

Gast
Also einen Thread mit "interrupt()" in den Selbstmord treiben ist die einzige Möglichkeit einen solchen vorzeitig abzubrechen. Schlechter Stil ist es, sie mit "stop()" gewaltsam zu töten (evtl. beziehen jetzt einige User mehr die Signatur eines Users nicht mehr unbedingt auf Foren-Threads ;)). Schlechter Stil ist es auch Threads mit Running-Flags zu zukleistern, das kann man sich für Runnables aufheben.
Aber mal am rande: Was du da machen willst, ist doch eigentlich nur 'ne Toggle-Funktion (obwohl mir dann der Sinn für den 3. Klick entfleucht). Wofür benötigst du da einen Thread?
BTW.: Wenn man innerhalb der "run()"-Methode eines Threads eine InterruptedException fängt (bzw. fangen muss), sollte man "interrupt()" an diesen Thread weitergeben (bedeutet: im Catch-Block "this.interrupt()" aufrufen).

Ach ja... Objekte, die von einem bereits toten Objekt referenziert werden sterben mit diesem Objekt, sofern es die letzte Referenz davon war. Dieses Nullsetzen ist ein Relikt aus den Zeiten, wo "finalize()" noch brauchbar erschien. Der aktuelle GC benötigt diese Aufmerksamkeit nicht mehr, so dass man sich das Nullsetzen sparen kann.

Und noch was ganz wichtiges: Threads, die einmal gelaufen sind, können nicht erneut gestartet werden, dazu benötigt man eine neue Instanz.
 
Zuletzt bearbeitet von einem Moderator:

Olli_M

Mitglied
Wobei ich ehrlich gesagt (auch nach vielen Jahren mit Verwendung von Threads) noch nie ganz kapiert hab, wozu es interrupt() gibt, da auch hier ja ein Flag gecheckt werden muss (interrupted()). Die Vorgehensweise mit dem eigenen volatile-Flag stand zumindest früher mal auch in Lehrbüchern drin.

Also hat man dann z.B. die Konstruktion
Code:
 while (!interrupted() && ownFlag) {}

Bisher bin ich immer ohne interrupt() ausgekommen. Kann natürlich dennoch sein, dass ich was übersehe, die Threadsachen sind nicht sonderlich intuitiv.

Olli
 
B

bone2

Gast
Java:
			if(pushed==false){
				Knopf1.setText("Beenden");
			}
			else{
				Knopf1.setText("Start");
			}
Java:
		while(this.isInterrupted()==false){
Zu allen Thread-Kommentaren hier noch ein Stil-Kommentar.
Pfui!
Man vergleicht booleans nicht nochmal mit booleans um dann einen neuen boolean zu bekommen.

Für das erste beispiel gibt es 2 möglichkeiten:
Java:
			if(! pushed){
				Knopf1.setText("Beenden");
			}
			else{
				Knopf1.setText("Start");
			}
Java:
			if(pushed){
				Knopf1.setText("Start");
			}
			else{
				Knopf1.setText("Beenden");
			}
fürs zweite:
Java:
		while(! this.isInterrupted()){
 

JJK3

Aktives Mitglied
Dafür ist:
Java:
while(this.isInterrupted()==false){
Für Anfänger und auch Fortgeschrittene leichter zu lesen!
Ein '!' kann man übersehen, bei einem '==false' ist das schon schwerer!
 
S

Spacerat

Gast
Dafür ist:
Java:
while(this.isInterrupted()==false){
Für Anfänger und auch Fortgeschrittene leichter zu lesen!
Ein '!' kann man übersehen, bei einem '==false' ist das schon schwerer!
...und in Java die einzige Möglichkeit den Semantic-Error No.1 zu produzieren... [c]while(n=true) { // do stuff };[/c]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9
B Threads benutzen Java Basics - Anfänger-Themen 5
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4
S Threads erzeugen Java Basics - Anfänger-Themen 11
K Threads Nur 2 von 3 Threads funktionieren Java Basics - Anfänger-Themen 8
P Threads Methode von Threads erledigen lassen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben