博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者-消费者模式的三种实现方式
阅读量:3924 次
发布时间:2019-05-23

本文共 2849 字,大约阅读时间需要 9 分钟。

背景

生产者生产数据到缓冲区中,消费者从缓冲区中取数据。

如果缓冲区已经满了,则生产者线程阻塞;

如果缓冲区为空,那么消费者线程阻塞。

方式一:synchronized、wait和notify

package producerConsumer;//wait 和 notifypublic class ProducerConsumerWithWaitNofity {    public static void main(String[] args) {        Resource resource = new Resource();        //生产者线程        ProducerThread p1 = new ProducerThread(resource);        ProducerThread p2 = new ProducerThread(resource);        ProducerThread p3 = new ProducerThread(resource);        //消费者线程        ConsumerThread c1 = new ConsumerThread(resource);        //ConsumerThread c2 = new ConsumerThread(resource);        //ConsumerThread c3 = new ConsumerThread(resource);            p1.start();        p2.start();        p3.start();        c1.start();        //c2.start();        //c3.start();    }            }/** * 公共资源类 * @author  * */class Resource{//重要    //当前资源数量    private int num = 0;    //资源池中允许存放的资源数目    private int size = 10;    /**     * 从资源池中取走资源     */    public synchronized void remove(){        if(num > 0){            num--;            System.out.println("消费者" + Thread.currentThread().getName() +                    "消耗一件资源," + "当前线程池有" + num + "个");            notifyAll();//通知生产者生产资源        }else{            try {                //如果没有资源,则消费者进入等待状态                wait();                System.out.println("消费者" + Thread.currentThread().getName() + "线程进入等待状态");            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    /**     * 向资源池中添加资源     */    public synchronized void add(){        if(num < size){            num++;            System.out.println(Thread.currentThread().getName() + "生产一件资源,当前资源池有"             + num + "个");            //通知等待的消费者            notifyAll();        }else{            //如果当前资源池中有10件资源            try{                wait();//生产者进入等待状态,并释放锁                System.out.println(Thread.currentThread().getName()+"线程进入等待");            }catch(InterruptedException e){                e.printStackTrace();            }        }    }}/** * 消费者线程 */class ConsumerThread extends Thread{    private Resource resource;    public ConsumerThread(Resource resource){        this.resource = resource;    }    @Override    public void run() {        while(true){            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            resource.remove();        }    }}/** * 生产者线程 */class ProducerThread extends Thread{    private Resource resource;    public ProducerThread(Resource resource){        this.resource = resource;    }    @Override    public void run() {        //不断地生产资源        while(true){            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            resource.add();        }    }    }

转载地址:http://ywugn.baihongyu.com/

你可能感兴趣的文章
Bluez下的rfcomm层通信测试程序
查看>>
GCC参数详解
查看>>
软件开发者面试百问
查看>>
硬盘安装Fedora 9
查看>>
嵌入式Linux系统的GDB远程调试实践
查看>>
Linux下基于bluez与obex的服务端实现流程
查看>>
Linux命令行程序设计
查看>>
简单实用的线程管理类
查看>>
static的作用
查看>>
蓝牙核心规范中HCI层的研究与开发分析□ 张 熠 姜玉泉 《电脑知识与技术》 2007年第09期
查看>>
蓝牙协议的命令和事件
查看>>
基于蓝牙的数据传输系统的设计
查看>>
开发 Linux 后台服务进程
查看>>
Linux操作系统下如何生成软件依赖关系图
查看>>
程序员,如何选择合适的程序语言
查看>>
linux下syslog使用说明
查看>>
ar和nm命令的使用
查看>>
__func__标识符
查看>>
define小结
查看>>
C99标准更新
查看>>