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() 方法。