public class Thread04 {
final Object object = new Object();
Runnable rb4 = new Runnable() {
public void run(){
synchronized (object){
System.out.println("T1 start!");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
object.notify();
System.out.println("T1 end!");
}
}
};
Runnable rb5 = new Runnable() {
public void run(){
synchronized (object){
System.out.println("T2 start!");
object.notify();
System.out.println("T2 end!");
}
}
};
public static void main(String[] args) {
Thread04 th = new Thread04();
new Thread(th.rb4).start();
new Thread(th.rb5).start();
}
}
object.notify(); de rb5 est appelé lorsque rb4 n'est pas entré dans l'état d'attente car il attend toujours le verrou. Le démarrage du thread ne signifie pas qu'il exécutera () tout seul immédiatement, ce qui signifie que le run () du thread qui démarre () après lui sera probablement exécuté en premier.
rb4
obtient le verrou d'objet deobject
pendant le fonctionnement, génèreT1 start!
, puis appellewait()
Cette méthode provoquera le blocage derb4
, libérera le verrou et bloquera en même temps. A ce momentrb5
obtient le verrou et sortT2 start!
. Appelez ensuiteobject.notify();
Bien querb4
soit destiné à s'exécuter, le verrou derb5
n'a pas été libéré, doncrb4
est toujours bloqué.rb5
Continuer l'exécution et la sortieT2 end!
.rb5
L'opération est terminée, le verrou est libéré,rb4
L'opération sortT1 end!
.