利用Lock接口实现多生产者多消费者
在上一篇文章中,我们介绍了等待唤醒机制里的notifyAll方法,并编写了多生产者和多消费者的代码示例。
但有一点,因为我们在使用wait()方法后,将4条线程睡眠,我们在生产完毕后,需要使用notifyAll()方法,来唤醒所有的线程,因为notify()方法是唤醒当前对象池子里随机一条线程,我们无法保证唤醒消费者线程的其中一个。
本篇文章,我们介绍利用Lock接口,来实现等待唤醒机制,并且可以将不同阵营的线程加以区分,以避免notify()方法随机性唤醒而造成的低效率问题。
class Resource{
private int count = 0;
private boolean isProduced = false;
private Lock lock = new ReentrantLock();
private Condition producerCondition = lock.newCondition();
private Condition consumerCondition = lock.newCondition();
public boolean isProduced() {
return isProduced;
}
public void setProduced(boolean isProduced) {
this.isProduced = isProduced;
}
public void produce() {
count++;
System.out.println("生产者线程---" + Thread.currentThread().getName() + "生产商品" + count);
}