生产者和消费者问题

生产者和消费者是操作系统中的一个经典问题,这个问题是在讲“进程同步”时的一个例子,下面我就用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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 场景:消费者:如果当前产品为0 的话,就等待; 生产者:生产一个产品,消费者唤醒,消费一个产品,继续等待 实现:
    魔器帝国阅读 1,105评论 0 0
  • 进程间通信有哪些方法? (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同...
    柠檬乌冬面阅读 842评论 0 1
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 2,020评论 0 8
  • 牧翃,一个新晋的斜杠青年—— 本名:张桉源 别称:戏霸 性别:男 就读于:山西传媒学院导演系,广播电视编导专业,戏...
    亥诗阅读 654评论 1 2
  • 房间里,还飘散着香氛的余味,那是他在遇见她以后留下的,久久不散。 好久不见,她过得会好吗?他在挪动咖啡杯的一瞬想起...
    邊思文阅读 655评论 0 1