Benutzung von Threads

Status
Nicht offen für weitere Antworten.

X5-599

Top Contributor
Hallo zusammen,

wie ich in einigen Beiträgen schon gesehen habe, sollten Threads mittels .invokeLater() benutzt werden.
Warum genau damit? Laut JavaAPI geht es doch einfach so:

Code:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();

Warum sollte ich statt also anstatt den Thread "von Hand" zu starten ihn in ein neues Runnable-Objekt packen und ihn dann von invokeLater() starten zu lassen?

Kann mir da jemand weiterhelfen?

Gruß,
Michael
 
S

SlaterB

Gast
und du willst diese 'einigen Beiträge' nicht verlinken, soll sich jeder selber was bei denken?
das ist ja wieder ein Rätsel-raten hier,

ich vermute mal, du meinst sowas wie
http://www.java-forum.org/de/viewtopic.php?t=73563

da gehts beileibe nicht um das Starten willkürlicher Threads,
sondern darum, eine bestimmte GUI-Aktion vom für die GUI zuständigen Thread durchführen zu lassen,

man kann in Java schlecht sagen 'hey du anderer Thread, führen diesen Code hier aus',
die Übergabe eines Runnable-Objektes (kein Thread!) ist eine mögliche Syntax

---------


das Starten eines Threads mit
new Thread(p).start();
selber in ein Runnable zu stecken und per invokeLater zu starten macht allerdings keinen Sinn (aus meiner Sicht)

in den invokeLater-run-Block gehören Befehle wie jscrollbar.setValue() oder so
 

Wildcard

Top Contributor
Alles was im Event Dispatcher Thread ausgeführt werden muss (das sind alle Aktionen die direkt, oder indirekt die GUI beeinflussen und dabei Methoden aufrufen die nicht explizit als Threadsafe markiert sind), ruft man über invokeLater order invokeAndWait auf. Mit invokeAndWait sollte man allerdings sparsam sein, da es Deadlock Potential birgt.
 
S

SlaterB

Gast
> deine erste antwort schlägt sowas in der main() Methode vor.

da wird ein GUI-Objekt erzeugt, das ist der Lehre nach wahrscheinlich richtig in invokeLater, obwohl es meist auch ohne funktioniert,
der Thread hängt dann vom erzeugten Objekt ab, kann dann gezwungenermaßen kaum woanders erzeugt werden
 

X5-599

Top Contributor
Also nochmal zum Verständnis:

Testbeispiel:

ProgressBar mit Runnable Implementierung
Code:
import javax.swing.JProgressBar;

public class Progressbar implements Runnable
{
	private static final long serialVersionUID = 1L;
	private JProgressBar pBar;
	
	public Progressbar()
	{
	    pBar = new JProgressBar(); 
	    pBar.setMaximum(1700);
	    pBar.setBounds(20, 20, 260, 20);
	}
	public JProgressBar getProgressBar()
	{
		return pBar;
	}

	public void run()
	{
	    for(int i = 0; i < pBar.getMaximum(); i++) 
	    {
	    	pBar.setValue(i); 
		    pBar.repaint(); 
		    
		    try
		    { 
	            Thread.sleep(1); 
		    }
		    catch(InterruptedException e)
		    { 
	            e.printStackTrace(); 
		    }
	    }
	}
}


HauptGui-Klasse
Code:
public class Application extends JFrame
{
	private static final long serialVersionUID = 1L;
	
	public Application()
	{
	    getContentPane().setLayout(null); 

	    setSize(300, 80); 
	    setTitle("Progress"); 
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	    setResizable(false); 
	    Progressbar p = new Progressbar();
	    getContentPane().add(p.getProgressBar());
	    setVisible(true);
	    
	    //new Thread(p).start();
	    SwingUtilities.invokeLater(p);
	    System.out.println("guithread");
	    System.out.println("guithread");
	}
}

gehe ich Recht in der Annahme, dass ich mit "SwingUtilities.invokeLater(p);" der HauptGui mitteile: hör mit dem darstellen der Gui auf und führe diesen Code von p aus(updaten der JProgressBar)?
So scheint es sich jedenfalls zu Verhalten. Denn die beiden "System.out"s (die nichts mit der Gui zu tun haben) werden nebenläufig ausgeführt...
Und da die JProgressBar zur Gui gehört, die nicht mehr dargestellt wird, da sich der Thread um das updaten der JProgressBar values kümmert, wird sie auch erst wieder angezeigt nachdem das Updaten der values erledigt ist?

Dann verstehe ich aber nicht, warum man das "SwingUtilities.invokeLater()" aus dem Thread der für die Gui zuständig ist aus aufrufen soll, wenn dieser dadurch (was die Gui angeht) blockiert wird.

Die auskommentierte Zeile: "new Thread(p).start();" anstelle des "SwingUtilities.invokeLater()" führt zu einem gewollten Ergebnis. Die JProgressBar wird aktualisiert und ist dabei sichtbar.
Gibt es irgendeinen Grund, warum man das nicht so machen sollte?
 
S

SlaterB

Gast
nein, dafür gibt es keinen Grund,
längere Aufgaben gehören immer in einen eigenen Thread, nie in invokeLater(),

gut erkennbar an Thread.sleep() oder sonstiger synchronisation/ Warten,
den GUI-Thread würde niemand warten lassen


allein die GUI-Befehle wie
pBar.setValue(i);
pBar.repaint();
könnte man nun wieder per invokeLater sicher ausführen lassen,
aber nicht die ganze Schleife,

fürs repaint() wäre das auch nicht nötig, das sorgt sowieo intern für einen invokeLater oder ähnlichen Aufruf,


denkbar wäre außerdem, den Konstruktor Application() per invokeLater auszuführen, da der ne Menge GUI-Code enthält

-----

> gehe ich Recht in der Annahme [..]

dürfe alles mehr oder weniger stimmen
 

Wildcard

Top Contributor
Du schiebst deinen Worker Thread in den EDT und genau das sollst du nicht tun.
Die Rückmeldung aus dem Worker Thread geschiet über invokeLater, nicht andersrum.
Thread.sleep(1) ist übrigens viel zu kurz und dank einem Windows Bug kann dir das sogar die Systemzeit verstellen (wenn du ein Windows System verwendest).
 

X5-599

Top Contributor
Danke nochmal ihr beiden :)

langsam denke ich, ich sollte die 5 sek Stllstand meiner Gui in Kauf nehmen. Davon bekommt man ja Kopfschmerzen. Ich wusste schon warum ich mir solange Zeit gelassen habe mit Threads...

@Wildcard
Du schreibst, genau das sollte man nicht tun. Workerthread in EDT. Hast du ein Beispiel(am besten anhand meines Codes) wie es richtig herum aussehen muss? Ich blick im Moment voll nicht mehr durch :?

Gruß,
Michael
 
S

SlaterB

Gast
schlecht:
> //new Thread(p).start();
> SwingUtilities.invokeLater(p);

ganz ok:
> new Thread(p).start();
> //SwingUtilities.invokeLater(p);

+Thread.sleep( >= 30)
 

X5-599

Top Contributor
nochmals Danke euch beiden!

jetzt hab ich ja ein paar ansätze wie man sowas lösen kann.

@Wildcard
nachdem ich den Quellcode aus deinem Link etwas durchgegangen bin ist mir so einiges klarer geworden. Und das ist doch schonmal was :wink: . Warum er da in der setValue() Methode die NPE abfängt hab' ich zwar nicht verstanden, aber ich denke ich bin für heute erstmal bedient...

Tortzdem stelle ich fest:
Ich würde das "status" Objekt gar nicht erst null'en nachdem die Schleife durch ist(brauch ich also keine NPE abfangen). Weiss einer warum das aber angebracht sein könnte?

Gruß und nochmals: Danke!,
Michael
 
S

SlaterB

Gast
Kommentare sollte man auch lesen?

Code:
      /* 
       * Der Algorithmus sollte nicht unnötig angehalten werden, nur damit die 
       * Progressbar schön aussieht, deshalb "invokeLater". Es kann nun aber 
       * passieren, dass der Algorithmus abbricht, nachdem er "setValue" 
       * aufgerufen hat (und damit die Variable "status" auf null setzt), das 
       * übergebene Runnable aber erst später ausgeführt wird. Aus diesem 
       * Grund wird ein try-catch-Block benutzt, der die mögliche 
       * NullPointerException abfängt. Alternativ könnte man mit dem Keyword 
       * "synchronized" einen Mechanismus bauen, der verhindert dass die 
       * Variable "status" verändert wird, während wir uns in dieser Methode 
       * befinden (und dann eine einfache if-Abfrage machen). 
       */ 
      SwingUtilities.invokeLater( new Runnable(){ 
         public void run() { 
            try{ 
               status.setValue( value ); 
            } 
            catch( NullPointerException ex ){ 
               // silent exception 
            } 
         } 
      });

edit: ok, ich muss eher deine Frage richtig lesen,
den Kommentart hast du wohl gelesen..

wegen GarbageCollection, einen großen Sinn sehe ich da aber auch nicht
 

X5-599

Top Contributor
Guten morgen zusammen,

@SlaterB
ja stimmt. den kommentar hatte ich gelesen :D . Bin nur nicht ganz schlau draus geworden... Egal.

@all
Gestern hab ich noch einmal meinen Programmcode geändert. Gemäss den neuen Erkenntnissen :wink:
Ich denke ich hab es jetzt so einigermassen kapiert. Also wenn einer von euch die (einigermassen) korrekte Anwendung von Threads und ProgressBar nocheinmal bestätigen könnte, würde ich diesen Beitrag als gelöst markieren.

hier mein Code:

Gui-Klasse
Code:
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class Application extends JFrame
{
	private static final long serialVersionUID = 1L;
	private JProgressBar jProgressBar;
	
	public Application()
	{
	    getContentPane().setLayout(null); 

	    setSize(300, 80); 
	    setTitle("Progress"); 
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	    setResizable(false); 
	    jProgressBar = new JProgressBar();
	    jProgressBar.setMaximum(100);
	    jProgressBar.setBounds(20, 20, 260, 20);
	    getContentPane().add(jProgressBar);
	    Updater updater = new Updater(jProgressBar);
	    setVisible(true);
	    
	    updater.startUpdating();
	}
}


Updater-Klasse
Code:
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;

public class Updater implements Runnable
{
	private JProgressBar jpb;
	
	public Updater(JProgressBar progress)
	{
		jpb = progress;
	}
	
	public void startUpdating()
	{
		new Thread(this).start();
	}

	public void run()
	{
		for(int i = 0; i < jpb.getMaximum(); i++)
		{
			setValue(i);
			try
			{
				Thread.sleep(100);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
	
	private void setValue(final int value)
	{
		SwingUtilities.invokeLater(new Runnable(){

			public void run()
			{
				jpb.setValue(value);
			}});
	}
}

Gruß,
Michael
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Fehlerhafte BufferedReader/switch Benutzung? Java Basics - Anfänger-Themen 2
E Problem mit Arrays bei Benutzung einer GUI Java Basics - Anfänger-Themen 3
U Reflection Benutzung Java Basics - Anfänger-Themen 2
M HTMLDocument benutzung Java Basics - Anfänger-Themen 2
U Richtige Benutzung der API-Doku Java Basics - Anfänger-Themen 8
H benutzung von datenbank / installer Java Basics - Anfänger-Themen 3
X Benutzung von Mixer (Sound, nicht Küche!) Java Basics - Anfänger-Themen 2
I Problem bei der benutzung eines wertes aus 2 quelltexten Java Basics - Anfänger-Themen 3
M Benutzung von fremden Java-Code mit Eclipse Java Basics - Anfänger-Themen 3
D Benutzung von globalen Variablen einzigste Lösung? Java Basics - Anfänger-Themen 6
S Benutzung von Thread -> Trennung GUI und Berechnungen &lt Java Basics - Anfänger-Themen 2
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
G 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
H Threads Java Basics - Anfänger-Themen 10
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

Ähnliche Java Themen

Neue Themen


Oben