Wait/Notify() bei Thread

tanechka

Bekanntes Mitglied
Hallo,

ich habe folgendes Code:
Java:
package mock;

public class TestThread {
	public static void main(String[] args) throws InterruptedException {
		Job thread = new Job();
        thread.start();
        
        synchronized (thread) {

        	System.out.println("synchronized block "+Thread.currentThread().getName());
            thread.wait();
        }
      
        System.out.println(thread.getNumber());
	}
}

class Job extends Thread {
	private Integer number = 0;

	public void run() {
		System.out.println("run "+Thread.currentThread().getName());
		for (int i = 1; i < 1000000; i++) {
			number++;
		}
	}

	public Integer getNumber() {
		return number;
	}
}
Ich habe Schwierigkeiten den Output nachzuvollziehen. Ich verstehe es so: Ich erstelle einen Thread und starte den, dann über synchronized block wird dieser Thread angehalten(bis irgendwo ein notify() Method aufgerufen wird). Wieso habe ich die Ausgabe 999999, obwohl ich den Thread angehalten habe?

Vielen Dank im Voraus
 
Zuletzt bearbeitet von einem Moderator:
Die Ausgabe 999999 bedeutet, dass der Thread run() durchgeführt hat. Ich habe mehrmals ausprobiert, immer dieselbe Ausgabe.

Ja das ist richtig, aber die Run-Methode ist von deinem Objekt "thread" .
Den du mit thread.start() angewiesen hast das zu berechnen. SEPARAT
Nach der Brechnung ist der Thread fertig somit terminiert er sich, dein Wait hat keine einfluss auf die Berechnung.
Es gilt lediglich für den synchronized Block, aber in dem passiert ja nichts. Es ist ein wenig kompliziert ^^

Schieb mal dein thread.start() in den Block weiter unter wait(), dann wird nichts passieren und das Programm hängt im DeadLock fest 😉
 
du meinst so:

Code:
synchronized (thread) {
			thread.start();
			System.out.println("synchronized block "
					+ Thread.currentThread().getName());
			thread.wait();
		}
es hat sich nichts geändert. Ich habe es mit dem wait() so verstanden, dass diese Methode zum Anhalten vom Thread dient. Wait() wird auch immer mit notify() oder notifyAll() benutzt. In meinem Beispiel ist also der Thread fertig mit dem run() bevor ich ihn anhalten, richtig?
 
Java:
synchronized (thread) {
			
			System.out.println("synchronized block "
					+ Thread.currentThread().getName());
			thread.wait();
thread.start();
		}
So war das gemeint 😉

Nein, wait() benutzt du um irrgendetwas threadsicher zu machen. Schreib dir deine eigene pause-Methode oder probier mal Thread.suspend()/Thread.resume() aus.
 
Hallo tanechka,

du legst deinen Main-Thread in Zeile 12 "schlafen" oder besser warten bis er durch ein notify() (oder notifyAll()) auf dem thread-Objekt (im folgenden nenne ich den mal Job-Thread) geweckt wird. Wenn ich dich richtig verstehe ist deine Frage, wieso der Main-Thread wieder aufwacht, wenn der Job-Thread, der deine Variable hochzählt, fertig ist, obwohl du kein notify() oder notifyAll() auf dem Job-Threadaufrufst.

Thread (Java Platform SE 7 )

Wenn dein Thread mit dem hochzählen fertig ist, stirbt dieser undes wird automatisch die notifyAll() auf dem Thread gerufen.

As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

Grüße,
Adalbert
 
Zuletzt bearbeitet:

Zurück
Oben