欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

生产者-消费者问题

程序员文章站 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();
                }
            }
        }
    }
}

 

 

相关标签: 操作系统