生产者和消费者

生产者和消费者先容

生产者和消费者是一个经典的问题,生产者负责生产,生产的东西放入buffer,消费者负责消费,从buffer取东西。关键是如何保证buffer里面不满不空,换句话说就是buffer里有东西就让消费者消费,buffer没有东西就让生产者生产。其实,大家可以通过wait和notify来实现。

生产者和消费者实例

package com.yuxi;

import java.util.LinkedList;

/**
 * 生产者和消费者问题
 * <p>
 * Created by yuxi on 17/2/2.
 */
public class ConsProd {
    private static LinkedList buffer = new LinkedList();
    private static int size = 10;

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        Producer produer = new Producer();
        new Thread(produer).start();
        new Thread(produer).start();
        new Thread(produer).start();
        new Thread(produer).start();
        new Thread(produer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
    }

    static class Producer implements Runnable {
        public void run() {
            synchronized (this) {
                if (buffer.size() == size) {
                    this.notify();
                } else {
                    buffer.add("something");
                    System.out.println("生产者生产了.....");
                }
            }
        }
    }

    static class Consumer implements Runnable {

        public void run() {
            synchronized (this) {
                if (buffer.isEmpty() || buffer.size() == 0) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    Object o = buffer.removeFirst();
                    System.out.println("消费者消费了...." + o);
                }
            }
        }
    }
}

从这个例子可以看出:

  • 1 如果生产者大于消费者,就会出现生产者生产过剩,超出buffer容量,就必须唤醒消费者消费。
  • 2 如果消费者大于生产者,就会出现无法消费问题,当buffer没有东西的时候,消费就会停滞。

当然还有其他的写法,这个这是结合wait和notify来实现的,如果了解juc的当然也可以使用,lock和condition来实现生产者和消费者。

推荐阅读更多精彩内容