import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class ProducerAndConsumer {
static class Goods{
private int id;
public Goods(int id){
this.id = id;
}
public int getId(){
return this.id;
}
}
private static volatile Queue<Goods> box;
private static final int maxSize = 100;
private static final int maxProducer = 80;//生产者线程数最好远大于消费者线程数
private static final int maxConsumer = 20;
private static AtomicInteger goodsId;
private static ReentrantLock lock;
private static Condition full;
private static Condition empty;
public ProducerAndConsumer(){
box = new LinkedList();
goodsId = new AtomicInteger(0);
lock = new ReentrantLock();
full = lock.newCondition();
empty = lock.newCondition();
}
static class Producer extends Thread{
@Override
public void run() {
lock.lock();
while (box.size()>=maxSize){
try {
full.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Goods goods = new Goods(goodsId.getAndIncrement());
box.add(goods);
System.out.println("生产者线程"+Thread.currentThread().getName().replaceFirst("Thread","")+"生产了"+goods.getId());
empty.signalAll();
full.signalAll();//别忘记这里唤醒其他被阻塞的生产者线程,也让他们去尝试加锁
lock.unlock();
try {
Thread.sleep(new Random().nextInt(300));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Consumer extends Thread{
@Override
public void run() {
lock.lock();
while (box.size()<=0){
try {
empty.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Goods goods= box.poll();
System.out.println("消费者线程"+Thread.currentThread().getName().replaceFirst("Thread","")+"消费了"+goods.getId());
full.signalAll();
empty.signalAll();
lock.unlock();
try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
ProducerAndConsumer box = new ProducerAndConsumer();
for(int i=0;i<maxProducer;i++){
Producer p = new Producer();
p.start();
}
for(int j=0;j<maxConsumer;j++){
Consumer c = new Consumer();
c.start();
}
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-64043.html