【原创代码,如有不足,欢迎指正!感谢!(* ̄︶ ̄) 】
【相互学习,天天向上】
【欢迎评论】
【一个没有天赋的女程序媛,今天又加油了!Fighting !】
/**
* 生产者消费者
*
* @author little_lion
*
*/
public class ProducerConsumer {
// 公平锁
private ReentrantLock lock = new ReentrantLock(true);
// 生产者condition
private Condition conditionProducer = lock.newCondition();
// 消费者condition
private Condition conditionConsumer = lock.newCondition();
/**
* 生产过程
*/
public void produce() {
try {
lock.lock();
if (Goods.goods.get() < 100) {// 生产总数,上限100
// 生产耗时
Thread.sleep(3000);
// 每次生产1个商品
Goods.goods.addAndGet(1);
System.out.println(Thread.currentThread().getName() + " 生产 1 个商品,当前商品总数 " + Goods.goods.get());
// 通知消费线程可以消费
conditionConsumer.signalAll();
} else {
conditionConsumer.signalAll();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
/**
* 消费过程
*/
public void consume() {
try {
lock.lock();
Random random = new Random();
int count = random.nextInt(9) + 1;// 随机产生要消费的商品数量[1,9]
if (Goods.goods.get() < count) {
conditionProducer.signalAll();
} else {
//消费耗时
Thread.sleep(2000);
//总数减去消费掉的count个商品
Goods.goods.addAndGet(count * -1);
System.out.println(Thread.currentThread().getName() + " 消费 " + count + " 个商品,当前商品总数 " + Goods.goods.get());
//通知生产线程生产
conditionProducer.signalAll();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
测试生产和消费过程
/**
* 商品
*
* @author little_lion
*
*/
public class Goods {
public static volatile AtomicInteger goods = new AtomicInteger(0);
public static void main(String[] args) {
final ProducerConsumer pc = new ProducerConsumer();
Runnable producerRunnable = new Runnable() {
public void run() {
while (true) {
pc.produce();
}
}
};
Runnable consumerRunnable = new Runnable() {
public void run() {
while (true) {
pc.consume();
}
}
};
Thread [] producerThreads=new Thread[10];
Thread [] consumerThreads=new Thread[5];
for (int i = 0; i < producerThreads.length; i++) {
producerThreads[i]=new Thread(producerRunnable);
producerThreads[i].setName("producer"+i);
producerThreads[i].start();
}
for (int i = 0; i < consumerThreads.length; i++) {
consumerThreads[i]=new Thread(consumerRunnable);
consumerThreads[i].setName("consumer"+i);
consumerThreads[i].start();
}
}
}
部分输出结果
【一个没有天赋的女程序媛,今天又加油了!Fighting !】