Java简单的生产者与消费者实现

来源:互联网 发布:form.js 跨域上传文件 编辑:程序博客网 时间:2024/05/21 10:13

在初始学习Java的过程中,多线程中的关于生产者与消费者问题常常困扰着我们,他们两者之间即相互依赖,又相互排斥。整理一个简单的消费者与生产者模式,代码如下:

package Colloection.bianli;/* * 生产者与消费者实例 * 该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题 * 该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据 * Runnable接口没有start方法,所以只能用其他方式执行 * wait()方法中的参数为不填写,如果使用wait(m)的方式,那么等待m毫秒的时间之后,会自动解除等待。wait()方法和notify()方法必须成对存在。初学者笔记,不喜勿喷 */public class ProducerAndConsumer {    public static void main(String[] args) {        Water water = new Water();//      Producer t1 = new Producer(water);//      Consumer t2 = new Consumer(water);//      t1.start();//      t2.start();        Producer t1 = new Producer(water);        Consumer t2 = new Consumer(water);        new Thread(t1).start();        new Thread(t2).start();    }}class Water{    boolean water = false;    public boolean isWater() {        return water;    }    public void setWater(boolean water) {        this.water = water;    }    public boolean isEmpty(){        return water ? false:true;    }}//生产者class Producer implements Runnable{    Water water;    public Producer(Water water) {        this.water = water;    }    @Override    public void run() {        System.out.println("开始进水...");        for(int i = 0;i<=5;i++){            try {                Thread.sleep(1000);                System.out.println("Producer进水"+i);            } catch (Exception e) {             e.printStackTrace();            }        }        water.setWater(true);        synchronized (water) {            water.notify();        }    }}//消费者//class Consumer extends Threadclass Consumer implements Runnable{    Water water;    public Consumer(Water water) {        this.water = water;    }    @Override    public void run() {        System.out.println("排水启动...");        if (water.isEmpty()) {            synchronized (water) {                try {                    System.out.println("水塘无水..等待中");                    water.wait();                } catch (Exception e) {                    e.printStackTrace();                }            }        }        System.out.println("开始排水:");        for(int i = 0 ;i<=5;i++){            try {                Thread.sleep(1000);                System.out.println(""+i+"分钟");            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

相信经过这个小示例,理解起来会更加容易。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 住的地方治安乱混混多怎么办 使命召唤进去感觉动作好慢怎么办 40岁后不够硬不持久怎么办 如果别人毁灭了你的梦想怎么办 如果死者托梦说自己过的不好怎么办 吵架了老婆跑回娘家不回家了怎么办 和老婆吵架她跑回娘家了怎么办 鞋子里面的皮穿的都是泥怎么办 绝地求生手游模拟器键位不灵怎么办 我更新目录的时候目录不存在怎么办 如果别人欠我钱不还 我该怎么办 老婆欠信用卡的钱我该怎么办 我欠了很多钱我该怎么办 一个人欠我钱跑了我该怎么办 买房子时间长了成危楼了怎么办 别人欠我钱人找不到了怎么办 欠银行信用卡钱人失踪了怎么办 欧洲卡车模拟2没油了怎么办 蓝牙安装包里没有微信怎么办 腾讯手游模拟器玩全军出击卡怎么办 手游cf用模拟器画面很抖怎么办 腾讯手游助手模拟器游戏卡死怎么办 腾讯手游模拟器提示注册以满怎么办 手游绝地求生被检测成模拟器怎么办 腾讯手游助手模拟器内存不够怎么办 微信视频对方听不到我的声音怎么办 学生考试传纸条作弊老师应怎么办 苹果手机微信小游戏没有声音怎么办 红米手机游戏下好了安装不了怎么办 小米手机sd卡存储已满怎么办 英雄联盟峡谷之巅资格被收回怎么办 人进监狱之前信用卡没还怎么办 荒野行动资源文件下载卡住了怎么办 荒野行动绑定的手机号停机了怎么办 不小心误点了爱奇艺扣款了怎么办 和别人吵架别人先骂你怎么办 自己人被带到了缅甸黑社会了怎么办 绝地求生忘记复制钥匙激活码怎么办 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办