Wie kann man nur einen Thread starten

Status
Nicht offen für weitere Antworten.

Tracer7

Mitglied
Hallo Leute

ich starte über einen Button einen Thread.
Über den Button wird folgende Methode aufgerufen:

public void oeffneDialog()
{

Thread dialog = new Thread(new EigenerDialog());
dialog.setName("MeinDialog");
dialog.start();

}

Wenn ich aber öffters auf den Button drücke, so wird
jedesmal ein neuer Thread gestartet und ein neuer
Dialog geöffnet.

Wie kann ich es verhindern dass der Thread öfters
gestartet wird, wenn ich öfters auf den Knopf drücke und
damit die Methode oeffneDialog öfters aufrufe.

Vielen Dank Tracer
 
Einfach mit Thread.getState() überprüfen, ob der Thread läuft. Falls ja, einfach nicht nochmal starten 🙂 .
 
Eine Referenz auf den Thread im Objekt speichern und vor dem Erzeugen eines neuen Threads prüfen, ob schon einer existiert und läuft.

Aber es ist ungewöhnlich das Öffnen eines Dialogs in einen Thread zu verpacken. Bist du sicher, dass du das so willst?
 
hallo hupfdule ,

kannst du mir bitte ein Codeschnipsel geben, das das macht.
Das mit dem Thread will ich, da ich eine Progressbar anzeige
und diese läuft nur wenn ein eigener Thread gestartet wurde,
Swing One-Threaded ist.

vielen Dank Tracer
 
Tracer7 hat gesagt.:
kannst du mir bitte ein Codeschnipsel geben, das das macht.

Den hat dir der Hobbit doch schon gegeben. Und den Rest wirst du doch wohl selbst hinkriegen.....
Aber von mir aus:

Code:
public void oeffneDialog() { 
  if (this.thread == null){
      this.thread = new Thread(new EigenerDialog()); 
      this.thread.setName("MeinDialog");   
  }

  if (!this.thread.isAlive){
     this.thread.start();
  }
}
Oder statt isAlive halt mit getState() testen (gibts aber erst ab Java 1.5)
 
Anstatt den Thread selbst als Instanzvariable zu speichern,
disable ich gleich den Button, um dem User gleich zu
visualisieren, daß der Thread bereits läuft.

Am Ende des Threads kannst du dann ja den Button wieder enablen.

Genau genommen, mache ich es so, daß der Button eine andere
Beschriftung und Bedeutung bekommt, sodaß der User in die Lage
versetzt wird, diesen Thread auch wieder zu unterbrechen:

"Start Calculation" ==> "STOP CALCULATION" ==> "Start Calculation" ==> ...
 
hm, also mit
if (this.thread == null){
this.thread = new Thread(new EigenerDialog());
this.thread.setName("MeinDialog");
}

if (!this.thread.isAlive){
this.thread.start();
}

gibt es bei mir nur Fehlermeldungen, weil er this.thread nicht kennt.
Die Klasse die die Threads startet ist ja zunächst kein Thread.
(Wenn auch die Main-Methode ein Thread ist)

Ich verstehe aber auch die Logik nicht, wo wird in dem Code
eine Referenz auf den Thread gespeichert ?

danke nochmal
Tracer
 
Du musst die Thread-Variable auch als Objektvarible definieren:
Code:
public class WasWeissIch extends Irgendwas implements Nothing {
 private Thread thread;
//Weiterer code
}
 
gibt es bei mir nur Fehlermeldungen, weil er this.thread nicht kennt.
Ich war der Meinung, dass du den Rest auch selbst ergänzen kannst.

Die Klasse die die Threads startet ist ja zunächst kein Thread.
Muss sie auch nicht. Sie referenziert nur einen Thread.

Ich verstehe aber auch die Logik nicht, wo wird in dem Code
eine Referenz auf den Thread gespeichert ?

Hier:

Code:
this.thread = new Thread(new EigenerDialog());

Der Thread wird erzeugt und in der Instanzvariablen this.thread gespeichert.
Diese muss natürlich deklariert werden, sonst beschwert sich der Compiler darüber, dass er die Variable nicht kennt.
 
Ich werde daraus nicht schlau.

Mein Code ist:

public Thread thread;
public void openDialog()
{

if (this.thread == null){
this.thread = new Thread(new Dialog());
}

if(this.thread.isAlive() == false)
{
this.thread.start();
}
}

Aber ich bekomme beim zweiten Aufruf der Methode eine
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException

Was mache ich den falsch ?? ???:L
 
Du musst den Thread ja auch neu initialisieren nachdem er lief.
Schreib statt
Code:
if (this.thread == null)
 this.thread = new Thread(new Dialog());

Code:
if (this.thread == null || !this.thread.isAlive())
 this.thread = new Thread(new Dialog());
 
Tracer7 hat gesagt.:
Aber ich bekomme beim zweiten Aufruf der Methode eine
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException

Dann ist mein Code wohl nicht so der Brüller. ;-)
Offenbar reicht das isAlive() nicht aus. Nun könntest du verschiedene Wege beschreiten:

1. Du nimmst stattdessen die Lösung von Leroy.
2. Du schaust in die API zu Thread (Java 1.4) und guckst, welche Prüfungen noch nötig sind
3. Du benutzt Thread.getState(), wie vom Hobbit vorgeschlagen. Die verschiedenen States findest du wieder um in der Api zu Thread.State (aber halt nur bei Java 1.5 oder höher)
 
Ok ich habe den Code geändert zu

public Thread thread;
public void openDialog()
{


if (this.thread == null || !this.thread.isAlive())
{
this.thread = new Thread(new Dialog());
}

if(this.thread.isAlive() == false)
{
this.thread.start();
}
}

Jetzt macht er aber fleisig neue Dialoge auf,
sobald ich auf den Knopf drücke.

Wieso bricht er nicht ab ?? :bahnhof:
 
hupfdule hat gesagt.:
1. Du nimmst stattdessen die Lösung von Leroy.
...

Hier mal ein KSKB zur Veranschaulichung:

Code:
import java.awt.*;
import javax.swing.*;

class Counter extends JFrame {
	JLabel counter = new JLabel("0");
	JButton start = new JButton("Start");
	boolean isRunning;
	boolean stopRun;
	
	public Counter() {
		add(start, BorderLayout.NORTH);
		add(counter, BorderLayout.SOUTH);
		start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				startOrStop();
			}});
		pack();
		setVisible(true);
	}
	
	void startOrStop() {
		if (isRunning)
			stopRun = true;
		else {
			stopRun = false;
			isRunning = true;
			start.setText("STOP");
			new Thread(new Runnable() {
				public void run() {
					int i = 0;
					while (!stopRun) {
						counter.setText(""+(++i));
						try {Thread.sleep(100);} catch (InterruptedException e) {}
					}
					isRunning = false;
					start.setText("Start");
				}}).start();
		}
	}
	
	public static void main(String[] args) {
		new Counter();
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben