Synchronisation von Threads

Status
Nicht offen für weitere Antworten.
H

h4nso

Gast
Hallo,

mein Problem ist so, zwei Threads (Thread1 & Thread2) warten auf ein Thread (Thread3). Thread3 macht ein notifyAll(),
aber nur das erste Thread, das in der wait()-queue ist, macht danach weiter.
Das andere Thread blockt 4 ever!

Weiß jemand an was das liegt oder was ich falsch gemacht haben könnte?

Außerdem habe ich noch zwei Fragen zur Synchronisation!
1.) Was ist der Unterschied zwischen notify() und notifyAll()? Ich habe gedacht alle Objekte, die auf das notify warten werden damit benachrichtigt!

2.) Wenn ein notify() gemacht wird (Thread3) und einer / beide Warte-Threads (Thread1 & Thread2) sind noch nicht in der wait() Methode,
werden diese Threads dann immer im wait() bleiben?

Vielen Dank schon mal im vorraus, ich hoffe ohne Code ist mein Problem verständlich, ansonsten kann ich noch ein kleines Beispiel zusammenstellen.
 
S

SlaterB

Gast
> Das andere Thread blockt 4 ever!
> Weiß jemand an was das liegt oder was ich falsch gemacht haben könnte?

kommt später kein weiteres notify? dann liegts daran,
ansonsten ist deine Beschreibung nicht ausreichend

'ich habe ein Programm und es geht nicht',
aha, kein Wunder

> ansonsten kann ich noch ein kleines Beispiel zusammenstellen

gute Idee

--------

1)
google? da gibts gleich direkte Vergleiche

2)
warum sollte nicht wenigstens einer raus dürfen?
ob der andere für immer drin bleibt, hängt wohl davon ab, ob für immer nie wieder notify() aufgerufen wird
 

Niki

Top Contributor
notify() weckt genau einen beliebigen Thread auf, der sich im wait-Pool dieses Monitors befindet.
notifyAll() weckt alle auf diesen Monitor wartenden Thread auf.

Kontrollier doch mal, ob alle Objekte auf den selben Monitor syncen. Wenn vor dem wait das notify aufgerufen wird, wartet der Thread natürlich für immer. Deshalb vielleicht auch mit flags arbeiten, dann kann sowas nicht passieren.
 
H

h4nso

Gast
ok, ich glaube da müsst Ihr mir doch ein wenig unter die Arme greifen. Dieses Beispiel ähnelt dem relevanten Part in meinem Programm:

Main.java
Code:
public class Main {

    public static void main(String[] args) {
        Thread3 t3 = new Thread3();

        new Thread1(t3);
        new Thread2(t3);
    }

}

Thread1.java
Code:
public class Thread1 implements Runnable {

	private Thread runner;
	private Thread3 t3;
 
    public Thread1(Thread3 t3) {
    	this.t3 = t3;
        this.runner = new Thread(this,"Thread1");
        System.out.println("Thread1 will start now ...");
        this.runner.start();
    }
 
    public void run() {
        System.out.println("Thread1 will wait for Thread3 ...");
        try {
        	if(!this.t3.isFinished()) {
        		synchronized(this.t3) {
        			this.t3.wait();
        			System.out.println("Thread1 finished Waiting, go on with process ...");
        		}
        	}
        } catch(InterruptedException e) {}
        System.out.println("Thread1 finished!");
    }

}

Thread2.java
Code:
public class Thread2 implements Runnable {

	private Thread runner;
	private Thread3 t3;
 
    public Thread2(Thread3 t3) {
    	this.t3 = t3;
        this.runner = new Thread(this,"Thread2");
        System.out.println("Thread2 will start now ...");
        this.runner.start();
    }
 
    public void run() {
        System.out.println("Thread2 will wait for Thread3 ...");
        try {
        	if(!this.t3.isFinished()) {
        		synchronized(this.t3) {
        			this.t3.wait();
        			System.out.println("Thread2 finished Waiting, go on with process ...");
        		}
        	}
        } catch(InterruptedException e) {}
        System.out.println("Thread2 finished!");
    }

}

Thread3.java
Code:
public class Thread3 implements Runnable {

    private Thread runner;
    private boolean finished;
 
    public Thread3() {
        this.runner = new Thread(this,"Thread3");
        this.finished = false;
        System.out.println("Thread3 will start now ...");
        this.runner.start();
    }
 
    public void run() {
    	try {
    		synchronized(this) {
    			Thread.sleep(3000);
    			System.out.println("Thread3 finished with important process, other Threads can go on!");
    			this.finished = true;
    			this.notifyAll();
    		}
    	} catch(InterruptedException e) { }
        System.out.println("Thread3 finished!");
    }

    public boolean isFinished() {
    	return this.finished;
    }

}

Also Thread3 muss erst ausgeführt werden, bevor Thread1 und 2 weitermachen können!
Das Beispiel erzeugt folgende Ausgabe:
Code:
Thread3 will start now ...
Thread1 will start now ...
Thread1 will wait for Thread3 ...
Thread2 will start now ...
Thread2 will wait for Thread3 ...
Thread3 finished with important process, other Threads can go on!
Thread3 finished!
Jetzt soll aber noch anschließende Thread1 und 2 weitermachen, doch es blockiert.
In meinem Programm bekommt aber eins von beiden ein notify und macht weiter, der andere nicht.

> Kontrollier doch mal, ob alle Objekte auf den selben Monitor syncen.
Wie kann ich den das herausfinden?

Wie könnte ich das jetzt so umsetzen wie ich das möchte?
 
H

h4nso

Gast
ok, ich glaube da müsst Ihr mir doch ein wenig unter die Arme greifen. Dieses Beispiel ähnelt dem relevanten Part in meinem Programm:

Main.java
Code:
public class Main {

    public static void main(String[] args) {
        Thread3 t3 = new Thread3();

        new Thread1(t3);
        new Thread2(t3);
    }

}

Thread1.java
Code:
public class Thread1 implements Runnable {

	private Thread runner;
	private Thread3 t3;
 
    public Thread1(Thread3 t3) {
    	this.t3 = t3;
        this.runner = new Thread(this,"Thread1");
        System.out.println("Thread1 will start now ...");
        this.runner.start();
    }
 
    public void run() {
        System.out.println("Thread1 will wait for Thread3 ...");
        try {
        	if(!this.t3.isFinished()) {
        		synchronized(this.t3) {
        			this.t3.wait();
        			System.out.println("Thread1 finished Waiting, go on with process ...");
        		}
        	}
        } catch(InterruptedException e) {}
        System.out.println("Thread1 finished!");
    }

}

Thread2.java
Code:
public class Thread2 implements Runnable {

	private Thread runner;
	private Thread3 t3;
 
    public Thread2(Thread3 t3) {
    	this.t3 = t3;
        this.runner = new Thread(this,"Thread2");
        System.out.println("Thread2 will start now ...");
        this.runner.start();
    }
 
    public void run() {
        System.out.println("Thread2 will wait for Thread3 ...");
        try {
        	if(!this.t3.isFinished()) {
        		synchronized(this.t3) {
        			this.t3.wait();
        			System.out.println("Thread2 finished Waiting, go on with process ...");
        		}
        	}
        } catch(InterruptedException e) {}
        System.out.println("Thread2 finished!");
    }

}

Thread3.java
Code:
public class Thread3 implements Runnable {

    private Thread runner;
    private boolean finished;
 
    public Thread3() {
        this.runner = new Thread(this,"Thread3");
        this.finished = false;
        System.out.println("Thread3 will start now ...");
        this.runner.start();
    }
 
    public void run() {
    	try {
    		synchronized(this) {
    			Thread.sleep(3000);
    			System.out.println("Thread3 finished with important process, other Threads can go on!");
    			this.finished = true;
    			this.notifyAll();
    		}
    	} catch(InterruptedException e) { }
        System.out.println("Thread3 finished!");
    }

    public boolean isFinished() {
    	return this.finished;
    }

}

Also Thread3 muss erst ausgeführt werden, bevor Thread1 und 2 weitermachen können!
Das Beispiel erzeugt folgende Ausgabe:
Code:
Thread3 will start now ...
Thread1 will start now ...
Thread1 will wait for Thread3 ...
Thread2 will start now ...
Thread2 will wait for Thread3 ...
Thread3 finished with important process, other Threads can go on!
Thread3 finished!
Jetzt soll aber noch anschließende Thread1 und 2 weitermachen, doch es blockiert.
In meinem Programm bekommt aber eins von beiden ein notify und macht weiter, der andere nicht.

> Kontrollier doch mal, ob alle Objekte auf den selben Monitor syncen.
Wie kann ich den das herausfinden?

Wie könnte ich das jetzt so umsetzen wie ich das möchte?
 
H

h4nso

Gast
sorry für den doppel-post, der server hat mir eine SQL-Fehlermeldung ausgespuckt und mich zurück verwiesen. Bin nicht davon ausgegangen, dass der Post erstellt wurde.
 

kleiner_held

Top Contributor
Das Problem ist das Thread 3 zuerst in den synchronized block eintritt und diesen damit quasi blockiert.
Thread 1 und Thread 2 warten also die 3 Sekunden nicht an der Stelle this.t3.wait();
sondern schon vor dem Eintritt in den synchronized block.
Das notifyAll(); von Thread 3 macht damit gar nichts und erst wenn Thread 3 den synchronized block verlaesst koennen die beiden jeweils weiter und bleiben dann an dem wait() haengen das nie ein notify() bekommt.

Loesungsmoeglichkeiten gibt es mehrere, z.B. wenn der relevante Teil von Thread 3 nur das notifyAll() im synchronized ausfuehrt.
Code:
Thread.sleep(3000);
System.out.println("Thread3 finished with important process, other Threads can go on!");
this.finished = true;
synchronized(this) {
    this.notifyAll();
}

Wenn du aber nur erreichen willst, das Thread 2 und 1 auf Thread 3 warten, wuerde ich nicht auf synchronized+wait()+notify() zurueckgreifen, sondern einfach auf java.lang.Thread.join()

PS: Es ist ein wenig verwirrend wenn deine Klassen ThreadX heissen aber nicht von Thread erben sondern nur Runable implementieren. Wenn du sowieso ein einmaliges internes Thread objekt mitfuehrst kannst du auch gleich von Thread erben.
 
H

h4nso

Gast
ok, so wie du das gepostet hast funktioniert das einwandfrei, auch mit notifyAll().
Ist das jetzt nur Zufall gewesen oder sollte ich wirklich join() verwenden?

Der Grund warum ich von Runnable ableite ist folgender, meine wirklichen Klassen, die auch nicht "ThreadX" heißen,
erben schon von einer abstrakten Klasse und haben somit nur noch die Option "Runnable".
 

kleiner_held

Top Contributor
Naja Zufall ist es nicht, allerdings muss der jeweilige Zugriff auf die finished variable auf alle Faelle mit in den synchronized block ansonsten gibts Probleme wenn Thread 3 zu schnell ist, also jeweils das
Code:
this.finished = true;
und
Code:
if(!this.t3.isFinished())
mit in den synchronized block.

Das join() ist in dem Fall einfach nur uebersichtlicher
Code:
public class Thread3 implements Runnable {
    private Thread runner; 
    [...]
    public void join() throws InterruptedException {
    	runner.join();
    }
}
  
public class Thread2 implements Runnable {
    [...]
    public void run() {
       System.out.println("Thread2 will wait for Thread3 ...");
       try {
           this.t3.join();
       } catch(InterruptedException e) {}
    }
}
 
H

h4nso

Gast
ok hab ich soweit verstanden, aber das mit dem
Code:
if(!this.t3.isFinished)
in den synchronized Block ist mir noch ein bisschen unklar.
Soll ich jetzt in der isFinished() Methode den sync machen oder im Thread1 bzw. 2 im run()?
 

kleiner_held

Top Contributor
Es waren die run() Methoden von Thread2 und Thread1 gemeint
Code:
public void run() {
        System.out.println("Thread2 will wait for Thread3 ...");
        try {
           synchronized(this.t3) {
              if(!this.t3.isFinished()) {
                 this.t3.wait();
                 System.out.println("Thread2 finished Waiting, go on with process ...");
              }
           }
        } catch(InterruptedException e) {}
        System.out.println("Thread2 finished!");
    }

Achso und ein
Code:
private boolean volatile finished = false;
in thread 3 ist wirklich besser.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Problem bei Synchronisation von Threads Java Basics - Anfänger-Themen 3
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
M Umgang mit Thread/ Synchronisation/ Deadlock-Vermeidung Java Basics - Anfänger-Themen 5
P Thread Synchronisation Java Basics - Anfänger-Themen 9
T Thread Synchronisation Java Basics - Anfänger-Themen 3
Dit_ Thread Synchronisation | Übung Java Basics - Anfänger-Themen 5
M lock notify synchronisation Java Basics - Anfänger-Themen 8
A Ausgabe immer anders, synchronisation? Java Basics - Anfänger-Themen 2
hdi Synchronisation zwischen JList und ListModel Java Basics - Anfänger-Themen 6
hdi statische synchronisation Java Basics - Anfänger-Themen 6
1 JList Problem : Synchronisation mit Vector klappt nicht :( Java Basics - Anfänger-Themen 6
Kr0e Synchronisation Java Basics - Anfänger-Themen 7
G Synchronisation Java Basics - Anfänger-Themen 8
A Thread Synchronisation Java Basics - Anfänger-Themen 10
M thread synchronisation Java Basics - Anfänger-Themen 6
S Sockets und Synchronisation Java Basics - Anfänger-Themen 7
U Synchronisation, Thread Java Basics - Anfänger-Themen 4
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

Ähnliche Java Themen

Neue Themen


Oben