検索

ホームページ  >  に質問  >  本文

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中文网2813日前959

全員に返信(2)返信します

  • PHP中文网

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

    rb5 の object.notify(); は、rb4 がまだロックを待っているため待機状態に入っていないときに呼び出されます。スレッドの開始は、スレッド自体がすぐに run() することを意味するわけではありません。つまり、スレッドの start() の後に run() が最初に実行される可能性が高いことを意味します。

    返事
    0
  • 迷茫

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

    rb4在运行获得object的对象锁,输出T1 start!,然后调用wait(),该方法会让rb4挂起,同时释放锁,阻塞。 这时候rb5获得锁,输出T2 start!。然后调用object.notify();,虽然这里打算让rb4运行,但是rb5的锁并没有释放,所以rb4还是处于阻塞。 rb5还是继续运行,输出T2 end!rb5运行结束,释放锁, rb4运行输出T1 end!

    返事
    0
  • キャンセル返事