java - wait(),notify(),notifyAll() T2 start! T2 end! T1 start! 为什么会阻塞
PHP中文网
PHP中文网 2017-04-18 10:53:24
0
2
893
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中文网

认证高级PHP讲师

reply all(2)
洪涛

rb5's object.notify(); is called when rb4 has not entered the wait state because it is still waiting for the lock. Thread start does not mean that it will run() by itself immediately, which means that the run() of the thread that starts() after it is likely to be executed first.

迷茫

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

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!