话不多说,直接上代码;
github代码地址
数量
package com.pattern.productorconsumer.lock;
/**
* 数量
*/
public class CountNum {
private Integer count;
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
生产者
package com.pattern.productorconsumer.lock;
/**
* 生产者
*/
public class Product {
private CountNum countNum;
private final Object lock;
public Product(CountNum countNum, Object lock){
super();
this.countNum = countNum;
this.lock = lock;
}
public void Produce(){
synchronized (lock){
if (countNum.getCount() < 5){
try {
Thread.sleep(500);
}catch (Exception e){
e.printStackTrace();
}
countNum.setCount(countNum.getCount() + 1);
System.out.println(Thread.currentThread().getName() + "生产+1,当前count:" + countNum.getCount());
lock.notifyAll();// 很重要
}else {
try {
lock.wait();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
消费者
package com.pattern.productorconsumer.lock;
/**
* 消费者
*/
public class Consumer {
private CountNum countNum;
private final Object lock;
public Consumer(CountNum countNum, Object lock){
super();
this.countNum = countNum;
this.lock = lock;
}
public void Consume(){
synchronized (lock){
if (countNum.getCount() > 0){
try {
Thread.sleep(500);
countNum.setCount(countNum.getCount() - 1);
System.out.println(Thread.currentThread().getName() + "消费-1,当前count:" + countNum.getCount());
lock.notifyAll();
}catch (Exception e){
e.printStackTrace();
}
}else {
try {
lock.wait();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
主程序
package com.pattern.productorconsumer.lock;
/**
* lock 实现 生产者 消费者 模式
*/
public class ProductAndConsumerPattern {
public static void main(String[] args) {
CountNum countNum = new CountNum();
countNum.setCount(0);
Object lock = new Object();
Product product = new Product(countNum,lock);
Consumer consumer = new Consumer(countNum,lock);
Thread[] pThread = new Thread[2];
Thread[] cThread = new Thread[2];
for (int i = 0; i < 2; i++) {
pThread[i] = new Thread(() -> {
while (true) {
product.Produce();
}
}, "生产者:" + (i + 1));
cThread[i] = new Thread(() -> {
while (true) {
consumer.Consume();
}
}, "消费者:" + (i + 1));
}
for (int i = 0;i < 2;i++){
pThread[i].start();
cThread[i].start();
}
}
}
执行结果:
总结:
1.加锁,防止高并发导致数量紊乱;
2.notifyall,多对多 不能使用notify,否则会死锁。