文档章节

并发编程实战 2.2. 生产者消费者 - wait() notifyAll()

火犀牛
 火犀牛
发布于 2016/05/14 16:19
字数 1240
阅读 1
收藏 0
点赞 2
评论 0

//todo : 解释 wait() notifyAll()

 范例: 生产者消费者

Storage

package com.rr.current2.c2_3_product_consumer.test;

import java.util.concurrent.TimeUnit;

/**
 * Created by Isaac on 16-5-14.
 */
public class Storage {
    private int count;
    private int size;

    public Storage(int size) {
        this.size = size;
    }

    //添加产品
    public synchronized void addProduct() {
        while (count >= size) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        count += 1;
        notifyAll();
        System.out.println("添加食物: " + count);
    }

    public synchronized void getProduct() {
        while (count <= 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        count -= 1;
        notifyAll();
        System.out.println("获取食物: " + count);
    }
}

生产者

package com.rr.current2.c2_3_product_consumer.test;

/**
 * Created by Isaac on 16-5-14.
 */
public class Producer implements Runnable {

    Storage storage;

    public Producer(Storage storage) {
        this.storage = storage;
    }

    //生产者负责生产
    @Override
    public void run() {

        for (int i = 0, len = 100; i < len; i++) {
            storage.addProduct();
        }
    }
}

消费者

package com.rr.current2.c2_3_product_consumer.test;

/**
 * Created by Isaac on 16-5-14.
 */
public class Customer implements Runnable {
    //消费者负责取东西
    Storage storage;

    public Customer(Storage storage) {
        this.storage = storage;
    }

    //生产者负责生产
    @Override
    public void run() {

        for (int i = 0, len = 100; i < len; i++) {
            storage.getProduct();
        }
    }
}

结果:

Main start!
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
添加食物: 1
添加食物: 2
添加食物: 3
添加食物: 4
添加食物: 5
添加食物: 6
添加食物: 7
添加食物: 8
添加食物: 9
添加食物: 10
获取食物: 9
获取食物: 8
获取食物: 7
获取食物: 6
获取食物: 5
获取食物: 4
获取食物: 3
获取食物: 2
获取食物: 1
获取食物: 0
Main end!

 

© 著作权归作者所有

共有 人打赏支持
火犀牛
粉丝 0
博文 27
码字总数 12180
作品 0
海淀
程序员
Java实现生产者-消费者模型

考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题。有如下几个考点: 对Java并发模型的理解 对Java并发编程接口的熟练程度 bug free coding style JDK版本:oracle java 1.8...

monkeysayhi
2017/11/20
0
0
Java实现生产者-消费者模型

考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题。有如下几个考点: 对Java并发模型的理解 对Java并发编程接口的熟练程度 bug free coding style JDK版本:oracle java 1.8...

猴子007
2017/10/16
0
0
Java并发编程初级篇(十六):Lock+Condition实现生产者消费者问题

之前我们在“Java并发编程初级篇(十二):使用wait和notify生产者消费者问题”,已经使用Java提供的synchronized关键字和wait(),notify(),notifyAll()方法实现过来生产者消费者问题。Java ...

阿拉德大陆的魔法师
2016/11/25
18
0
wait()&nitifyAll()简单工作调度

多线程模型其实用得最多的就是生产者-消费者模式,其实现在流行的异步执行也是在这基础上发展起来的。其实问题的关键就是一句话,如何保证多线程任务能够按一定的顺序执行,因为实际的问题往...

Acce1erator
2016/12/13
37
0
如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 ...

牧师-Panda
2016/10/20
21
0
浅谈synchronized、wait、notify和notifyAll

一、概念解读 synchronized:同步锁,可修饰类、方法、代码块; wait:使当前线程进入等待状态,直到锁定对象被唤醒(notify、notifyAll),然后当前线程进入就绪状态;可指定最大等待时间,...

叫我宫城大人
2017/10/20
0
0
JAVA线程6 - 线程间的通信

一、概述 线程之间需要一些协调通信,来共同完成一件任务。 二、线程间的通信 1. 线程交互 多个线程在处理同一资源,但是任务却不同。 其中涉及的三个方法 : wait():让线程处于阻塞状态,被w...

小米米儿小
2014/02/26
0
0
Java设计模式 - 生产者、消费者

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。 实际上,准确说应该是“生产者-消费者-仓储”模型,...

YuanyuanL
2015/08/10
0
0
Java Queue协作同步机制

  在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期...

IamOkay
2016/08/11
164
0
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内...

Dreyer
2015/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PostgresSQL 查看当前schema下所有的函数/存储过程

selectroutine_name from information_schema.routineswhere routine_catalog = 'YourDBName'and routine_schema = 'YourSchemaName'order by routine_name;...

Leyxiao
3分钟前
0
0
去除bootstrapValidator 的校验结果

$("#form").data('bootstrapValidator').destroy();//会报没有这个方法,很奇怪 $('#form').data('bootstrapValidator',null); $('#form').bootstrapValidator();...

暗中观察
4分钟前
0
0
java环境安装

1、首先下载jdk安装包,一般去官网,官网需要登录才可以下载。 2、下载完成双击运行,想改路径改下路径,比较简单。安装jdk安装完,会弹出个窗口,提示开始安装jre的位置,我这里窗口比较奇葩...

朝如青丝暮成雪
6分钟前
0
0
Linux Command

Copy with progress rsync -r --progress source dest

Lyle_W
7分钟前
0
0
个灯数据营销,帮你找回被浪费的广告费

近日,个灯受邀出席被喻为广告营销业界的年度盛会——第八届梅花网传播业大展北京站的活动。 在展会上,个灯总经理严雯婷女士带来了《数据增能,营销智能》的主题演讲,以理论与实践相结合的...

个推
9分钟前
0
0
java的反射机制理解

一、概念说明 java的反射机制,是在运行状态下,可以动态获取任意一个类的属性和方法;可以动态调用一个对象任意方法; 二、反射相关类 java.lang.Class; //类 java.lang.re...

盼望明天
12分钟前
0
0
nginx反向代理-多端口映射

代码解释 1.1 http:www.baidu.test.com默认是80,访问“/”利用反向代理,然后访问本地8083; 1.2 8083代表本地的前端工程访问地址,前端需要访问后台数据,”/”,继续代理到后台地址9803; ...

lilugirl
14分钟前
0
0
Jfinal使用log4j2打印日志

1,添加maven配置 <properties><log4j2.version>2.11.0</log4j2.version><slf4j.version>1.7.25</slf4j.version></properties> <!--slf4j及log4j2日志 --><dependency> ......

iborder
15分钟前
0
0
如何在Rancher 2.0上快速部署Datadog

Datadog是一种流行的托管监控解决方案,用于聚合和分析分布式系统的指标和事件。从基础架构集成到协作仪表板,Datadog为用户提供了一个简洁的单一窗格视图,用户可以快速查看对其最重要的信息...

RancherLabs
18分钟前
0
0
Java示例演示Functor 和monad

This article was initially an appendix in our Reactive Programming with RxJavabook. However introduction to monads, albeit very much related to reactive programming, didn't suit......

Quan全
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部