如果说重入锁ReentrantLock的lock()与unlock()方法的作用和synchronized的作用类似,那么Condition的await(),signal(),signalAll()作用就是和Object.wait(),Object.notify(),Object.notifyAll()类似:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * 使用condition 实现生产和消费的关系 */ public class TestCondition{ private static ReentrantLock lock = new ReentrantLock(); private static Condition providerCondition = lock.newCondition(); private static Condition consumerCondition = lock.newCondition(); private static int food = 30; //食物的数量 public static class Provider implements Runnable{ @Override public void run(){ while(true){ lock.lock(); if((food + 1)> 30){ //超过30就等待 // lock.lock(); try { System.out.println("食物过剩: 等待"); providerCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ try { ++food; System.out.println("生产之后剩余食物的数量:" + food); consumerCondition.signal(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } lock.unlock(); } } } public static class Consumer implements Runnable{ @Override public void run() { while(true) { lock.lock(); if (food - 2 < 0) { //不足0个则等待 try { System.out.println("食物不足:等待"); consumerCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } else { try { food = food - 2; System.out.println("消费之后剩余食物的数量" + food); providerCondition.signal(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } lock.unlock(); } } } public static void main(String[] args) throws InterruptedException { System.out.println(consumerCondition == providerCondition); Thread t1 = new Thread(new Provider(), "provider"); Thread t2 = new Thread(new Consumer(), "consumer"); t1.start(); Thread.sleep(3000); t2.start(); } }
控制台显示(部分数据:):
消费之后剩余食物的数量28
消费之后剩余食物的数量26
消费之后剩余食物的数量24
消费之后剩余食物的数量22
生产之后剩余食物的数量:23
生产之后剩余食物的数量:24
生产之后剩余食物的数量:25
生产之后剩余食物的数量:26