生产者和消费者问题

生产者和消费者是操作系统中的一个经典问题,这个问题是在讲“进程同步”时的一个例子,下面我就用Java语言中的notify和wait关键字实现这个算法。

生产者

/**
 * Description: 生产者.
 *
 * @author: crane-yuan
 */
public class Producer extends Thread
{
    static final int MAXQUEUE = 10;
    private Vector   messages = new Vector();
    /**
     * Description:
     *
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        try {
            while (true) {
                putMessage();
                sleep(1500);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private synchronized void putMessage() throws InterruptedException {
        while (messages.size() == MAXQUEUE) {
            wait();
        }
        messages.add(new Date().toLocaleString());
        System.out.println("put message...");
        notify();
    }
    //Called by Consumer
    public synchronized String getMessage() throws InterruptedException {
        notify();
        while (messages.size() == 0) {
            wait();
        }
        String message = (String) messages.firstElement();
        messages.remove(message);
        return message;
    }
}

消费者



/**
 * Description: 消费者.
 *
 * @author: crane-yuan
 */
public class Consumer extends Thread
{
    Producer producer;
    Consumer(Producer p) {
        producer = p;
    }

    /**
     * Description:
     *
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        try {
            while (true) {
                String message = producer.getMessage();
                System.out.println("Got message: "+message);
                sleep(2000);
            }
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }

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

结果

put message...
Got message: 2016-11-5 17:06:28
put message...
Got message: 2016-11-5 17:06:30
put message...
Got message: 2016-11-5 17:06:32
put message...
put message...
Got message: 2016-11-5 17:06:33
put message...
Got message: 2016-11-5 17:06:35
put message...
Got message: 2016-11-5 17:06:36
put message...
put message...
Got message: 2016-11-5 17:06:38

推荐阅读更多精彩内容

  • 生产者和消费者问题详解 定义 生产者消费者问题(英语:Producer-consumer problem),也称有...
    牧童遥指2000阅读 959评论 3赞 5
  • 场景:消费者:如果当前产品为0 的话,就等待; 生产者:生产一个产品,消费者唤醒,消费一个产品,继续等待 实现:
    魔器帝国阅读 394评论 0赞 0
  • 进程间通信有哪些方法? (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同...
    柠檬乌冬面阅读 299评论 0赞 1
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 489评论 0赞 8
  • 牧翃,一个新晋的斜杠青年—— 本名:张桉源 别称:戏霸 性别:男 就读于:山西传媒学院导演系,广播电视编导专业,戏...
    亥诗阅读 69评论 1赞 2