生产者消费者模型

    技术2026-04-07  9

    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(); } } }
    Processed: 0.012, SQL: 10