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

资源--箱子中的苹果:

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. Java集合Collention

    集合:又被称为容器,用来存储数据,他是一个对象,能够将具有相同性质的多个元素汇聚成一个整体,集合被用于存储,获取,操纵和传输聚合的数据. 这种数据结构称为集合 Collenction:他是集合的根接口 ...

  2. css常用语法续集

    1   设置字体  body{font-familly:“宋体”} 2 可以使用下面代码设置网页中文字的字号为12像素,并把字体颜色设置为#666(灰色): body{font-size:12px;c ...

  3. 初始SpringMVC 完整版

    初始SpringMVC 1.SpringMVC 也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的. 2.Java EE ...

  4. DAO模型 架构

    这是项目的架构 dao层下面有一个平级的包 impl   //dao层  访问数据库. GradeDAOImpl 他继承了BaseDAO 实现了IGradeDAO接口 public class Gra ...

  5. 二进制文件安装k8s所需要的证书服务

    利用二进制文件安装etcd所需要的证书服务 CFSSL是CloudFlare开源的一款PKI/TLS工具. CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API ...

  6. AI and Robot

    Have you ever seen a movie called "Ex Machina"?  I like this movie very much. Artificial i ...

  7. tab选项卡代码

    $('.case_header ul li').click(function(){ $(this).addClass('active').siblings().removeClass('active' ...

  8. Selenium模拟登陆百度贴吧

    Selenium模拟登陆百度贴吧 from selenium import webdriver from time import sleep from selenium.webdriver.commo ...

  9. 基于http(s)协议的模板化爬虫设计

    声明:本文为原创,转载请注明出处 本文总共三章,前面两章废话吐槽比较多,想看结果的话,直接看第三章(后续会更新,最近忙着毕设呢,毕设也是我自己做的,关于射频卡的,有时间我也放上来,哈哈). 一,系统总 ...

  10. 带图标和多行显示的ListBox

    源码https://www.codeproject.com/Articles/15464/Extending-the-ListBox-to-show-more-complex-items 定义控件 u ...