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然后依次往下执行