经典问题生产者与消费者java并发线程模拟实现

生产者与消费者问题是操作系统中一个基础的问题。大致描述如下:生产者生产产品,消费者消费该产品。生产者只有等待消费者将产品消费完之后才能继续生产下一个产品,而消费者只有等带生产者生产完才能进行消费。生产者依赖于消费者,消费者依赖于生产者。
将该问题放到Java中来实现就是一个并发的多线程的问题,为了保证数据的完整性,需要借助线程同步的synchronized,用于控制数据同步时的一致。
同时为了保证生产者和消费者之间有序的进行需要使用wait和notify来实现线程的等待和唤醒操作。

直接贴代码,有问题,欢迎交流

/**
 * 生产者消费者模拟
 * Created by Gsr on 2016/9/19 0019.
 */
public class ProducerConsumer {
    public static void main(String[] args) {
        Product info = new Product();
        Producer pro = new Producer(info);
        Consumer con = new Consumer(info);
        new Thread(pro).start();//生产者先起动,用于生产
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(con).start();
    }
}

/**
 * 产品信息
 */
class Product {
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    private String name = "生产者";

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    private String content = "产品0";
    private boolean flag = true;//true表示正在生产,false表示可以消费,开始的时候必须置为true表示正在生产,还不能消费

    public synchronized void set(String name, String content) {//用于模拟生产过程
        while (!flag) {//表示还没有被取走,继续等待
            try {
                super.wait();//等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.setName(name);
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.setContent(content);
        System.out.println("生产过程:"+this.getName()+" --> "+this.getContent());
        flag = false;//改变标志位表示可以取走
        super.notify();
    }

    public synchronized void get() {//将产品取出,用于模拟消费过程
        while (flag) {//表示还没有生产好,继续等待
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("消费过程: "+this.getName() + " --> " + this.getContent());
        flag = true;//表示可以生产
        super.notify();
    }
}

/**
 * 生产者
 */
class Producer implements Runnable {
    private Product info = null;//保存Info引用
    public Producer(Product info) {
        this.info = info;
    }
    @Override
    public void run() {
        boolean flag = true;
        while(true) {
            if (flag) {
                this.info.set("生产--1", "产品1");
                flag = false;
            } else {
                this.info.set("生产--2", "产品2");
                flag = true;
            }
        }
    }
}

/**
 * 消费者
 */
class Consumer implements Runnable{
    private Product info = null;
    public Consumer(Product info){
        this.info = info;
    }
    @Override
    public void run() {
        while(true)
            this.info.get();
    }
}

目前研究于Spark与Hadoop,群QQ号:521066396(spark,hadoop交流群),欢迎加入共同学习,一起进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值