一种重要的模式,基于等待/通知机制。生产者/消费者模式描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模式关注的是以下几个点:
1、生产者生产的时候消费者不能消费
2、消费者消费的时候生产者不能生产
3、缓冲区空时消费者不能消费
4、缓冲区满时生产者不能生产
代码实例:
public class LockPattern_A {
static int food=10;//设定开始食物储量
Lock lock;
Condition condition;
public LockPattern_A(Lock lock,Condition condition) {
// TODO Auto-generated constructor stub
this.condition=condition;
this.lock=lock;
}
/*生产者*/
public void producer() {
try {
while(food>0) {
lock.lock();
/*当食物储量超过30时就唤醒消费者线程,进行消费*/
if (food>30) {
System.out.println("过剩,需要消费");
condition.await();
}
System.out.println("食物不够,增加食物");
System.out.println("当前食物储量"+food);
food+=10;//生产者每次增加10个食物
condition.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
/*消费者*/
public void consume() {
try {
while(food>=5) {
lock.lock();
/*当食物少于5个时就唤醒生产者线程进行生产*/
if (food<=5) {
System.out.println("食物不够,需要生产");
condition.await();
}
System.out.println("消费食物");
System.out.println("当前食物储量"+food);
food-=5;//每次消费5个食物
condition.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
final LockPattern_A a = new LockPattern_A(lock, condition);
/*生产者线程*/
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
a.producer();
}
});
/*消费者线程*/
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
a.consume();
}
});
t1.start();
t2.start();
}
}