箱子中的苹果代表资源,现在有消费者从箱子中拿走苹果,生产者往箱子中放苹果。代码如下:

资源--箱子中的苹果:

public class Box {
int size;
int num; public Box(int size, int num) {
this.size = size;
this.num = num;
} public synchronized void put() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (num == 10) { //用while循环检查更好,在下面的wait()结束后还再判断一次,防止虚假唤醒
try {
System.out.println("箱子满了,生产者暂停。。。");
this.wait(); //等待消费者消费一个才能继续生产,所以要让出锁
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
}
num++;
System.out.println("箱子有空闲,开始生产。。。"+num);
this.notify(); //唤醒可能因为没苹果而等待的消费者
} public synchronized void take() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (num == 0) { //用while循环检查更好,在wait()结束后还再判断一次,防止虚假唤醒
try {
System.out.println("箱子空了,消费者暂停。。。");
this.wait(); //等待生产者生产一个才能继续消费,所以要让出锁
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
}
num--;
System.out.println("箱子有了,开始消费。。。"+num);
this.notify(); //唤醒可能因为苹果满了而等待的生产者
}
}

生产者、消费者:

public class Consumer implements Runnable {

    private Box box;

    public Consumer(Box box) {
this.box= box;
} @Override
public void run() {
while (true){
box.take();
} }
}
public class Producer implements Runnable {

    private Box box;

    public Producer(Box box) {
this.box= box;
} @Override
public void run() {
while (true){
box.put();
} }
}

Main方法:

public class ConsumerAndProducer {

    public static void main(String[] args) {
Box box = new Box(); Producer p1 = new Producer(box); //生产线程 Consumer c1 = new Consumer(box); //消费线程 new Thread(p1).start(); new Thread(c1).start();
}
}

以上,就是生产者消费者模式的Java代码实现。当然,我们完全可以使用JUC包的Lock接口下的类代替Synchronized完成代码同步:

Lock l = new ReentrantLock();
Condition condition = l.newCondition(); l.lock() //加锁 l.unlock() //释放锁 condition.await() //代替wait() condition.signal() //代替notify()

除了上述方法,也可以使用JUC包下BlockingQueue接口的阻塞队列完成,那样更简单。实际上,阻塞队列也是基于上述的基本思想实现的----队列满了就停止装入线程、空了就让取队列元素的线程等待。上述的Box就是一个阻塞队列的抽象模型(当然阻塞队列比这个还是要复杂很多)。

消费者、生产者Java代码示例,wait的更多相关文章

  1. MapReduce序列化及分区的java代码示例

    概述 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, ...

  2. kafka集群和zookeeper集群的部署,kafka的java代码示例

    来自:http://doc.okbase.net/QING____/archive/19447.html 也可参考: http://blog.csdn.net/21aspnet/article/det ...

  3. 将MySQL一张表的数据迁移到MongoDB数据库的Java代码示例

    Java代码: package com.zifeiy.snowflake.handle.etl.mongodb; import java.sql.Connection; import java.sql ...

  4. 生产者消费者模型-Java代码实现

    什么是生产者-消费者模式 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相 ...

  5. 阿里云直播鉴权java代码示例

    段时间公司需要做直播服务,所以就研究了一下阿里云的直播,在直播里面,最重要的就是url的鉴权操作(验证推流或者拉流的有效性),在网上找了很多代码,都没有发现java的demo,所以就写篇播客记录一下, ...

  6. java代码示例(3)

    /** * 需求分析:根据输入的天数是否是周六或是周日, * 并且天气的温度大于28摄氏度,则外出游泳,否则钓鱼 * @author chenyanlong * 日期:2017/10/14 */ pa ...

  7. spark使用KryoRegistrator java代码示例

    转载引用自:http://www.cnblogs.com/tovin/p/3833985.html 最近在使用spark开发过程中发现当数据量很大时,如果cache数据将消耗很多的内存.为了减少内存的 ...

  8. android webView开发之js调用java代码示例

    1.webView设置 webView.getSettings().setJavaScriptEnabled(true);//设置支持js webView.addJavascriptInterface ...

  9. 服务端发送xml请求java代码示例

    /** * */ package com.autoyol.pay.cmb.core; import java.io.ByteArrayOutputStream; import java.io.IOEx ...

随机推荐

  1. docker环境下使用gitlab,gitlab-runner 为 NetCore 持续集成

    环境 Centos7.6 安装应用docker,docker-compose (我的Centos是用Hyper-V跑的分了8G的内存,阿里云2G根本跑不起来gitlab) 为了保证我的Centos环境 ...

  2. LeetCode 解题目录

    0001. 两数之和(Java) 0003. 无重复字符的最长子串(Java) 0172. 阶乘后的零 (Java) 0287. 寻找重复数(Java)

  3. Cookie和Session的使用详解

    我们在使用接口请求时经常听到Cookie和Session的知识,那么它们的实际意义和使用场景在哪里呢 ?    介绍如下 一.首先需要了解的是为什么需要有Cookie和Session这两个东西:Htt ...

  4. 目标检测评价指标mAP 精准率和召回率

    首先明确几个概念,精确率,召回率,准确率 精确率precision 召回率recall 准确率accuracy 以一个实际例子入手,假设我们有100个肿瘤病人. 95个良性肿瘤病人,5个恶性肿瘤病人. ...

  5. Thinkphp5.0快速入门笔记(2)

    学习来源与说明 https://www.kancloud.cn/thinkphp/thinkphp5_quickstart 测试与部署均在windows10下进行学习. 示例建立新的模块和控制器 在a ...

  6. html的一些基本语法学习与实战

    其实在学校前端开始之前,问过自己为什么要学,因为自己学的比较杂,直到现在刚刚毕业出来工作了,才明确了方向了,要往嵌入式方向走,但是随着时代的发展,在编程和智能硬件结合的越来越紧密,特别是物联网这一块, ...

  7. android ——活动的生命周期

    在其生命周期内,activity在运行.暂停和停止三种可能的状态间进行转换,不同状态之间互相转换的时候的调用不同的方法,重写这些方法就能在活动切换,被销毁时保存或传输数据,在被启动.被切换出来时接收数 ...

  8. Linux安装nfs共享文件

    简介nfs nfs网络文件系统常用于共享音视频,图片等静态资源.将需要共享的资源放到NFS里的共享目录,通过服务器挂载实现访问. 服务端安装: yum install -y nfs-utils rpc ...

  9. HTML5标签的使用和作用

    在菜鸟教程中找了一些关于HTML5的知识点,觉得很有用,可以整理一下,以后使用. 这是一个基本的HTML5文档: <!DOCTYPE html><html><head&g ...

  10. 常用maven 命令

    重新依赖:mvn package -U -DskipTest=true; 在本地安装jar包:mvn install 清除产生的项目:mvn clean 运行测试:mvn test 上传到私服:mvn ...