生产者-消费者问题
程序员文章站
2024-01-30 18:27:04
...
生产者 -消费者问题,也称为有界缓冲区问题;两个进程(线程)共享一个公共的固定大小的缓冲区,一个为生产者,将信息放入缓冲区,另一个为消费者,从缓冲区去读取信息;当缓存区满的时候,生产者 还想向其中加入新的数据项的时候,让生产者睡眠,待消费者从缓冲区中取出一个或多个数据的时候,再唤醒生产者,当消费者试图从空的缓冲区中取出数据的时候,消费者就睡眠,直到生产者向其中加入一些数据的时候吧再唤醒它;为了跟踪缓冲区中的数据项数,我们需要一个变量count,如果缓冲区中最多放N个数据项,生产者首先检查count值 是否为N,当相等的时候,生产者沉睡;否则向其中加入一些数据项,并增加count值;消费者是首先检查count是否为0,当为0的时候 ,消费者沉睡,否则取走 一个数据并且count--;每个进程同时也要检测另一个进程是否应该被唤醒,若需要则将其唤醒;
用wait()/notify()来实现,代码 如下:
package study.iostudy.ProducerAndConsumer; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Created by Taoyongpan on 2017/11/26. */ public class CusAndPro { public int count = 0;//总数 public BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);//阻塞队列,内存缓冲区 private volatile boolean isRunning = true;//判断当前线程是否在运行当中 public static void main(String[] args){ CusAndPro cusAndPro = new CusAndPro(); Consumer consumer = cusAndPro.new Consumer(); Producer producer = cusAndPro.new Producer(); Thread cusT = new Thread(consumer); Thread proT = new Thread(producer); proT.start(); cusT.start(); } /** * 生产者 */ public class Producer implements Runnable { @Override public void run() { while (isRunning){ synchronized (queue){ int data = (int) (100* Math.random()); if (count==10){ try { System.out.println("队列已满"); queue.wait(); }catch (Exception e){ e.printStackTrace(); queue.notify(); } } queue.add(data); count++; queue.notify(); } } } } /** * 消费者 */ public class Consumer implements Runnable{ @Override public void run() { while (isRunning){ synchronized (queue){ if (count==0){ try { System.out.println("队列已经空了;"); queue.wait(); }catch (Exception e){ e.printStackTrace(); queue.notify(); } } queue.poll(); count--; queue.notify(); } } } } }
下一篇: 使用观察者模式处理错误信息