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
 

The_S

Top Contributor
Einfach mit Thread.getState() überprüfen, ob der Thread läuft. Falls ja, einfach nicht nochmal starten :) .
 

hupfdule

Top Contributor
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?
 

Tracer7

Mitglied
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
 

hupfdule

Top Contributor
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)
 

Leroy42

Top Contributor
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" ==> ...
 

Tracer7

Mitglied
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
 

JPKI

Top Contributor
Du musst die Thread-Variable auch als Objektvarible definieren:
Code:
public class WasWeissIch extends Irgendwas implements Nothing {
 private Thread thread;
//Weiterer code
}
 

hupfdule

Top Contributor
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.
 

Tracer7

Mitglied
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
 

JPKI

Top Contributor
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());
 

hupfdule

Top Contributor
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)
 

Tracer7

Mitglied
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:
 

Leroy42

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Kann ich einen thread zwei mal starten ? Allgemeine Java-Themen 3
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Z Threads Thread für einen Client Allgemeine Java-Themen 9
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
H SwingWorker statt Thread für einen Server Allgemeine Java-Themen 2
G einen Thread beim Schlafen überraschen und abschießen Allgemeine Java-Themen 3
P eigener Thread für einen JButton Allgemeine Java-Themen 32
A Einen Thread von einem anderen aus anhalten? Allgemeine Java-Themen 11
J Wie stoppe ich einen Thread richtig? Allgemeine Java-Themen 21
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
R Wie gestaltet man einen Authentifizierungsflow? Allgemeine Java-Themen 6
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
N Wie mache ich einen UnitTest? Allgemeine Java-Themen 16
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
Jose05 Gibt es einen Nachteil bei dem JDK 8? Allgemeine Java-Themen 7
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
ZH1896ZH Best Practice Wie erstellt man am besten einen Kalender? Allgemeine Java-Themen 3
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
Zrebna FileUtils.cleanDirectory() - aber einen sub-Ordner "verschonen" Allgemeine Java-Themen 1
MiMa Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
MoxxiManagarm Ich brauche einen smarten Ansatz Allgemeine Java-Themen 23
J Gebautes Jar per Maven in einen Docker Container kopieren Allgemeine Java-Themen 0
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
E Einen Bot Programmieren. Allgemeine Java-Themen 6
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
P [Webdriver] einen Datensatz signieren Allgemeine Java-Themen 0
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Wie einen ClientBuilder / JarBuilder programmieren? Allgemeine Java-Themen 14
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
L Wie programmiert man einen Listener? Allgemeine Java-Themen 1
Thallius Wie convertiere ich einen pkcs8 key in einen java lesbaren? Allgemeine Java-Themen 16
M Was braucht man, um einen Java Job zu bekommen? Allgemeine Java-Themen 8
G Substrings in einen String zusammenfassen Allgemeine Java-Themen 5
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
N Compiler-Fehler Warum erhalte ich einen Nullpointer Fehler? Allgemeine Java-Themen 2
P Zum src Ordner einen Projektes navigieren Allgemeine Java-Themen 8
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
MaxG. Swing Wie kann man einen Dateiordner auswählen ? Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
KeVoZ_ int Werte in einen String fassen Allgemeine Java-Themen 4
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
S Einen Punkt um den Ursprung drehen Allgemeine Java-Themen 5
M Genaues Bugtracking - jemand einen Vorschlag? Allgemeine Java-Themen 14
L Gibt es in Java einen Property Editor? Allgemeine Java-Themen 2
S Einen übergebenen String kopieren Allgemeine Java-Themen 3
L Wie kann ich einen Keystore aus existierenden Zertifikaten erstellen? Allgemeine Java-Themen 1
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
U in java an einen Rückgabewert aus matlab rankommen Allgemeine Java-Themen 2
B einen color-chooser bauen, ähnliche Farben vermeiden Allgemeine Java-Themen 5
B .txt Datei in einen kompletten String konvertieren Allgemeine Java-Themen 20
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
M String in einen 2D array bringen Allgemeine Java-Themen 2
Y Prüfen ob ein Graph immer einen von mehren Enden erreicht Allgemeine Java-Themen 4
J (Java3D) Einen Faden programmieren - Logikproblem Allgemeine Java-Themen 5
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
Rudolf In wie fern lohnt sich C++ für einen Javaentwickler Allgemeine Java-Themen 70
A Welches Speichermanagement für einen Kalkulator Allgemeine Java-Themen 7
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
J String-Typ in einen generischen Typ T umwandeln Allgemeine Java-Themen 6
S RandomAcessFile das einen InputStream wrappt..? Allgemeine Java-Themen 2
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
H Wie erzeugt man einen Daemon? Allgemeine Java-Themen 7
S Wie beendet man einen Process in Java Platform unabhänging? Allgemeine Java-Themen 8
A nur einen Wert aus einer .conf lesen und erneuern Allgemeine Java-Themen 3
S MANIFEST DATEI hat nur einen Eintrag Allgemeine Java-Themen 14
M Einen Prozess "crashen" lassen Allgemeine Java-Themen 9
I getResponseCode(); returnt einen falschen Wert? Allgemeine Java-Themen 7
U Wie kann mit einen Java Applet Dateien erstellen,verschieben und löschen? Allgemeine Java-Themen 9
A Framework für einen Web Service Allgemeine Java-Themen 6
I %AppData% Variable für einen Prozess setzen Allgemeine Java-Themen 23
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
S regex für einen Link Allgemeine Java-Themen 3
M Client für einen Webservice erstellen (ONVIF) Allgemeine Java-Themen 3
T Undwandlung eines String in einen InputStream? Allgemeine Java-Themen 3
M Selbst geschriebener InputStreamReader über einen beliebigen InputStream Allgemeine Java-Themen 4
P Datei in einen String lesen Probleme bei Codierung Allgemeine Java-Themen 2
A Variable Parameterinhalte an einen Query übergeben? Allgemeine Java-Themen 3
M einen Tag addieren Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben