码迷,mamicode.com
首页 > 编程语言 > 详细

线程之 生产者消费者例子

时间:2015-05-19 19:09:55      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

package hpu.acm.lzl.demos;

/**
 * 生产者和消费者问题
 * 问题描述:一个篮子容器放馒头,生产者负责生产馒头,往篮子里面放,消费者负责从篮子里面拿馒头吃。
 * @author lzl
 *问题分析:
 *里面有 篮子容器类 SyncStack   提供push方法用于生产者的生产,pop类用于消费者消费
 *    馒头类 StreamedBun
 *    生产这类 Producer
 *    消费者类 Consumer
 */
public class ProducerConsumer {
    public static void main(String[] args) {
        SyncStack ss = new SyncStack();
        Producer p = new Producer(ss);
        Consumer c = new Consumer(ss);
        new Thread(p).start();  //生产者
        new Thread(p).start();  //生产者
        new Thread(p).start();  //生产者
        new Thread(p).start();  //生产者
        new Thread(p).start();  //生产者
        new Thread(c).start();   //消费者
    }
}
//定义馒头类,提供其ID号
class StreamedBun{
    int id ;
    public StreamedBun(int id) {
        this.id = id;
    }
    public String toString(){
        return "馒头:"+id;
    }
}
//定义一个容器盛放馒头
class SyncStack{
    StreamedBun []mt = new StreamedBun[10]; //定义容器中只能装入10个馒头
    int index=0;    //添加一个索引,用于查找
    //将生产的馒头进行累加,synchronized关键字用于锁定当前方法,防止其他线程打断
    public synchronized void push(StreamedBun sb) {
        while(index == mt.length){
            try {
                this.wait();                //这里如果篮子中的馒头装满了,就要等待消费者消费一些,才能再生产。
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        this.notify();                   //将唤醒生产者,进行生产馒头。
        mt[index] = sb;                    //将馒头加到容器当中
        index++;
    }
    //从篮子中取出馒头的方法。
    public synchronized StreamedBun pop(){
        while(index == 0){
            try {
                this.wait();                //消费者要考虑,篮子中如果馒头空了,那么就要等待生产者,生产馒头。
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        this.notify();                    //将唤醒消费者,吃馒头。
        index -- ;
        return mt[index];
    }
}
//生产者,只需要调用 篮子容器的push方法,便能进行生产了。
class Producer implements Runnable{
    public SyncStack ss;
    public Producer(SyncStack ss) {
        this.ss = ss;
    }
    @Override
    public void run() {
        for(int i=0;i<30;i++){    //假设循环生产30个 馒头
            StreamedBun sb = new StreamedBun(i);
            ss.push(sb);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("生产者:生产了"+sb);
        }
    }
}
//消费者,只需要调用 篮子容器的pop方法,便能进行消费。
class Consumer implements Runnable{
    public SyncStack ss;
    public Consumer(SyncStack ss) {
        this.ss = ss;
    }
    @Override
    public void run() {
        for(int i =0;i<30;i++){
            StreamedBun sb = ss.pop();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("消费者:消费了"+sb);
        }
    }
    
}

线程之 生产者消费者例子

标签:

原文地址:http://blog.csdn.net/u011521890/article/details/45846867

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!