Maison  >  Questions et réponses  >  le corps du texte

java - wait(),notify(),notifyAll() T2 start! T2 end! T1 start! 为什么会阻塞

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();
     }
 }
PHP中文网PHP中文网2717 Il y a quelques jours885

répondre à tous(2)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 10:55:24

    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.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 10:55:24

    rb4 obtient le verrou d'objet de object pendant le fonctionnement, génère T1 start!, puis appelle wait() Cette méthode provoquera le blocage de rb4, libérera le verrou et bloquera en même temps. A ce moment rb5 obtient le verrou et sort T2 start!. Appelez ensuite object.notify(); Bien que rb4 soit destiné à s'exécuter, le verrou de rb5 n'a pas été libéré, donc rb4 est toujours bloqué. rb5Continuer l'exécution et la sortie T2 end!. rb5L'opération est terminée, le verrou est libéré, rb4L'opération sortT1 end!.

    répondre
    0
  • Annulerrépondre