多线程理解一个非常好的例子

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--;    
                      
                    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(100);  //确保按顺序A、B、C执行  
        new Thread(pb).start();  
        Thread.sleep(100);    
        new Thread(pc).start();        
        }     
}   

打印结果:

ABCABCABCABCABCABCABCABCABCABC

Thread.sleep的停顿作用非常重要:

整个过程就是

(1)pa执行->c锁住->a锁住打印A->notify没有唤醒任何线程->a释放锁->c释放锁并且pa处于waiting状态->

(2)pb执行->a锁住->b锁住打印B->notify没有唤醒任何线程->a锁释放并且pb处于waiting状态

(3)pc执行->b锁住->c锁住打印C->notify这里会唤醒pa(这里pc会执行完(包括两层synchronized全部执行完)再去执行notify里面的线程)

   pa再次进入循环,打印A并唤醒pb然后依次往下执行

猜你喜欢

转载自www.cnblogs.com/smallJunJun/p/10402630.html