生产者-消费者问题

       生产者 -消费者问题,也称为有界缓冲区问题;两个进程(线程)共享一个公共的固定大小的缓冲区,一个为生产者,将信息放入缓冲区,另一个为消费者,从缓冲区去读取信息;当缓存区满的时候,生产者 还想向其中加入新的数据项的时候,让生产者睡眠,待消费者从缓冲区中取出一个或多个数据的时候,再唤醒生产者,当消费者试图从空的缓冲区中取出数据的时候,消费者就睡眠,直到生产者向其中加入一些数据的时候吧再唤醒它;为了跟踪缓冲区中的数据项数,我们需要一个变量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();
                }
            }
        }
    }
}

猜你喜欢

转载自taoyongpan.iteye.com/blog/2400932