public class MyThreadPrinter2 implements Runnable {     
    
    private String name;     
    private Object prev;     
    private Object self;     
    
    private MyThreadPrinter2(String name, Object prev, Object self) {     
        this.name = name;     
        this.prev = prev;     
        this.self = self;     
    }     
    
    @Override    
    public void run() {     
        int count = 10;     
        while (count > 0) {     
            synchronized (prev) {     
                synchronized (self) {     
                    System.out.print(name);     
                    count--;    
                    try{  
                    Thread.sleep(1);  
                    }  
                    catch (InterruptedException e){  
                     e.printStackTrace();  
                    }  
                      
                    self.notify();     
                }     
                try {     
                    prev.wait();     
                } catch (InterruptedException e) {     
                    e.printStackTrace();     
                }     
            }     
    
        }     
    }     
    
    public static void main(String[] args) throws Exception {     
        Object a = new Object();     
        Object b = new Object();     
        Object c = new Object();     
        MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a);     
        MyThreadPrinter2 pb = new MyThreadPrinter2("B", a, b);     
        MyThreadPrinter2 pc = new MyThreadPrinter2("C", b, c);     
             
             
        new Thread(pa).start();  
        Thread.sleep(10);  
        new Thread(pb).start();  
        Thread.sleep(10);  
        new Thread(pc).start();  
        Thread.sleep(10);  
    }     
}    
我对这里的notify和wait ,a,b,c谁先拿到锁不太理解??
还有就是两层synchronized 也是理解不了。求详细解答啊!!
求高手解释一下,谢谢了!!

解决方案 »

  1.   

    不知道,楼主想编写一个什么样的程序。
    wait/notify方法,都是成对出现的,楼主展现的代码里面,都是单个出现的,很让人诧异。
    其次,
    wait/notify方法的使用中,wait方法必须让现场持有该对象的监听器,所以,必须添加synchronized块。
    当线程调用wait方法时,释放该对象的锁,
    而notify则不存在这个事情,所以,notify方法可以不用被synchronized块包围。
      

  2.   


    这是多线程里面比较经典的一个例子,三个线程循环打印10次ABC
    notify一样要持有对象的锁jdk的说明
    此方法只应由作为此对象监视器的所有者的线程来调用
    IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
      

  3.   

    其实wait和notify是成对的,只是一个线程的wait由另一个来notify再加大难度,如果不能控制线程启动的先后顺序,怎么样写这个程序呢
      

  4.   

    是这样的,notify,不是在两个synchronized的外面,只在self,里面,所以他第一次次self.notify();叫醒了b,然后释放a的锁,但是 prev.wait();在synchronized(c)里面,所以此时c没醒,a和b执行,打印出A。     
    然后这样依次执行,打印10次ABC。