condition
  多线程之间按照顺序调用,实现A->B->C, 
   三个线程启动,要求如下, 
   A打印5次,B打印10次,C打印15次, 
   反复重复10轮。 
 import java.util.concurrent.locks.*;
class ShareResource {
	private int number=1;
	private Lock lock=new ReentrantLock();
	private Condition condition1=lock.newCondition();
	private Condition condition2=lock.newCondition();
	private Condition condition3=lock.newCondition();
	public void println5() {
		lock.lock();
		try {
			while(number!=1) {
				condition1.await();
			}
			for (int i=1; i<=5; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			number=2;
			condition2.signal();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
	public void println10() {
		lock.lock();
		try {
			while(number!=2) {
				condition2.await();
			}
			for (int i=1; i<=10; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			number=3;
			condition3.signal();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
	public void println15() {
		lock.lock();
		try {
			while(number!=3) {
				condition3.await();
			}
			for (int i=1; i<=15; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			number=1;
			condition1.signal();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
}
public class ThreadOrderAccess {
	public static void main(String[] args) {
		ShareResource sr=new ShareResource();
		new Thread(() -> {
			for (int i=0; i<10; i++) {
				sr.println5();
			}
		},"A").start();
		new Thread(() -> {
			for (int i=0; i<10; i++) {
				sr.println10();
			}
		},"B").start();
		new Thread(() -> {
			for (int i=0; i<10; i++) {
				sr.println15();
			}
		},"C").start();	
	}
} Condition 是一种更细粒度的并发解决方案。   就拿生产者消费者模式来说,当仓库满了的时候,又再执行到 生产者 线程的时候,会把 该 生产者 线程进行阻塞,再唤起一个线程, 
   但是此时唤醒的是消费者线程还是生产者线程,是未知的。 
   如果再次唤醒的还是生产者线程,那么还需要把它进行阻塞,再唤起一个线程,再此循环,直到唤起的是消费者线程。 
   这样就可能存在 时间或者资源上的浪费,所以说 有了Condition 这个东西。 
   Condition 用 await() 代替了 Object 的 wait() 方法,用 signal() 方法代替 notify() 方法。 
   注意:Condition 是被绑定到 Lock 中,要创建一个 Lock 的 Condition 必须用 newCondition() 方法。
 
 查看4道真题和解析
查看4道真题和解析