继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

多线程之生产者消费者模式

大咪
关注TA
已关注
手记 13
粉丝 5954
获赞 495
package com.sy;

/**
 * 
 * 生产者/消费者问题
 * 
 * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)
 *从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果
 *生产者试图生产更多的产品,店员会叫生产者停一下,
 *如果店中有空位放产品了在通知生产者继续生产,如果店中没有产品了,店员
 *会告诉消费者一下,如果店中有产品了在通知消费者来取走产品。
 *
 *
 *分析:
 *
 *1.是否涉及到多线程的问题?是!生产者、消费者两个都是线程。
 *2.是否涉及到共享数据?有!考虑线程的安全
 *3.此共享数据是谁?即为产品的数量。
 *4.是否涉及到线程的通信呢?存在着生产者与消费者的通信
 *
 *
 */
//店员
class Clerk{

    //产品
    int product;

    //生产产品
    public synchronized void addProduct(){
        if(product >=20){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else {
            product++;
            System.out.println(Thread.currentThread().getName() + ":生产了第" + product + "个产品");
            notifyAll();
        }
    }

    //消费产品
    public synchronized void consumeProduct(){
        if(product <= 0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else{
            System.out.println(Thread.currentThread().getName() + ":消费了第" + product + "个产品");
            product--;
            notifyAll();
        }
    }
}

//生产者
class Producer implements Runnable{

    Clerk clerk;
    //设置一个构造器,将Clerk传入
    public Producer(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println("生产者开始生产产品");
        while(true){
            try {
                Thread.currentThread().sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.addProduct();
        }
    }
}

//消费者
class Consumer implements Runnable{
    Clerk clerk;
    public Consumer(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println("消费者消费产品");
        while(true){
            try {
                Thread.currentThread().sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.consumeProduct();
        }
    }
}

public class TestProduceConsume {

    public static void main(String[] args) {

        Clerk clerk = new Clerk();
        Producer p1 = new Producer(clerk);
        Consumer c1 = new Consumer(clerk);

        Thread t1 = new Thread(p1);//一个生产者的线程
        Thread t2 = new Thread(c1);//一个消费者的线程

        t1.setName("生产者1");
        t2.setName("消费者1");

        t1.start();
        t2.start();
    }
}
打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP