使用wait/notify来实现生产者消费者时能够达到在线程阻塞的效果,这样就不会出现轮询,然后浪费cpu时间的目的。代码如下:
1. 状态类,表示是否已经生产:

 package com.demo;

 public class State {

     public State() {
flag = false;
} public boolean flag;
}

State.java

2. 生产者类:

 package com.demo;

 public class Productor extends Thread {

     public com.demo.State state;

     @Override
public void run() {
for(int i=0; i<10;) {
try {
synchronized(state) {
if(state.flag) {
state.wait();
} else {
System.out.println("product: " + i);
i++;
state.flag = true;
state.notify();
}
}
}
catch(Exception ex) { }
}
}
}

Productor.java

3. 消费者类:

 package com.demo;

 public class Consumer extends Thread {

     public com.demo.State state;

     public void run(){
for(int i=0; i<10;) {
try {
synchronized(state) {
if(!state.flag) {
state.wait();
} else {
System.out.println("consumer: " + i);
i++;
state.flag = false;
state.notify();
}
}
}
catch(Exception ex) { }
}
}
}

Consumer.java

4. 测试类

 package com.demo;

 public class Program {

     public static void main(String[] args) throws Exception {
State state = new State();
Productor productor = new Productor();
productor.state = state;
Consumer consumer = new Consumer();
consumer.state = state;
Thread th1 = new Thread(productor);
Thread th2 = new Thread(consumer);
th1.start();
th2.start();
th1.join();
th2.join();
}
}

Program.java

在生产者和消费者每次执行的时候总是先判断state.flag的状态,为false表示已经没有生产,这样消费者应该等待,而生产者应该生产;为true表示已经生产,这样生产者应该等待,而消费者应该消费。而这生产者生产了后将flag设置为true,这样就表示已经生产了,然后通知消费者,这样生产者再次执行的时候发现消费者还没消费的话就处于阻塞状态,而消费者在收到通知后就开始消费过程,然后将flag设置为false,再通知生产者,如此周而复始。
使用wait/notify可能会应为线程的执行的先后顺序不同而造成死锁,而在本实现中是通过同一个对象的flag属性的真假来判断的,所以即便执行顺序不一致,也不会出现消费者先于生产者生产前消费,所以也就避免了死锁。

生产者-消费者(wait-notify实现)的更多相关文章

  1. 通过生产者消费者模式例子讲解Java基类方法wait、notify、notifyAll

    wait(),notify()和notifyAll()都是Java基类java.lang.Object的方法. 通俗解释wait():在当前线程等待其它线程唤醒.notify(): 唤醒一个线程正在等 ...

  2. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

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

  3. java多线程15 :wait()和notify() 的生产者/消费者模式

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  4. 生产者消费者模型——wait/notify/notifyAll使用

    告警系统架构如下 1. 数据处理系统处理完原始数据并入库后,发送消息到kafka系统: 2. 告警生产者从kafka系统查询消息存入告警消息队列: 3. 告警消费者从告警消息队列查询消息进行处理. 这 ...

  5. Java 中 wait, notify 和 notifyAll的正确使用 – 以生产者消费者模型为例

    如何使用Wait 尽管关于wait和notify的概念很基础,它们也都是Object类的函数,但用它们来写代码却并不简单.如果你在面试中让应聘者来手写代码,用wait和notify解决生产者消费者问题 ...

  6. 多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现

    一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...

  7. wait、notify应用场景(生产者-消费者模式)

    Java实现生产者消费者的方式有:wait && notify.BlockingQueue.Lock && Condition等 wait.notify注意事项:(1) ...

  8. (三)(2)wait/notify实现生产者-消费者模型,join方法

    生产者,消费者模型 举个例子来说明,厨师,服务员,厨师做菜,服务员上菜,如果厨师没有做好菜,那么服务员就无法上菜,厨师做好了菜,然后通知服务员消费(上菜).在这个过程之中,厨师扮演的就是生产者,服务员 ...

  9. synchronized wait notify 生产者消费者

    1.生产者消费者模型 public class ProducterConsumerTest{ public static void main(String[] args){ System.out.pr ...

  10. 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列

    简介 多线程通信一直是高频面试考点,有些面试官可能要求现场手写生产者/消费者代码来考察多线程的功底,今天我们以实际生活中母鸡下蛋案例用代码剖析下实现过程.母鸡在鸡窝下蛋了,叫练从鸡窝里把鸡蛋拿出来这个 ...

随机推荐

  1. php7 数据导出Excel office 2011中文乱码问题

    public function test(){ $data = array( array( 'name' => '对对对', 'score' => 80, 'grade' => '急 ...

  2. Linux下的python3,virtualenv,Mysql、nginx、redis安装配置

    常用服务安装部署   学了前面的Linux基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环境: centos7 + vmware + xshell MYSQL(mariadb) ...

  3. Linux3.10.0块IO子系统流程(6)-- 派发SCSI命令到低层驱动

    在SCSI策略例程中最后调用scsi_dispatch_cmd将SCSI命令描述符派发给低层驱动进行处理 /** * scsi_dispatch_command - Dispatch a comman ...

  4. linux基本网络配置

    -- linux基本网络配置管理 rhel6开始有一个networkmanger的网络配置服务(可以图形配置网络,拔号,无线连接,vpn等)但此服务开启会造成你的ip不固定(会dhcp获取),而且后期 ...

  5. maven win 安装 与 IntelliJ IDEA 配置Maven【2018-11-14最新最有姿势攻略】

    [博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] http ...

  6. Codeforces Round #324 (Div. 2) (哥德巴赫猜想)

    题目:http://codeforces.com/problemset/problem/584/D 思路: 关于偶数的哥德巴赫猜想:任一大于2的偶数都可写成两个素数之和. 关于奇数的哥德巴赫猜想:任一 ...

  7. JVM Optimization

    架构图 基本概念说明 堆(heap):数据存储,对象实例:空间往上增长,线程共享区:大小可通过-Xmx和-Xms配置 新生代(Young Generation):划分为Eden Space和两个Sur ...

  8. QFileSystemModel中通过flags函数反应代码的层级思考

    Qt的Model/View设计中,有一些隐藏的代码,它们大多放在私有类里,对于类的作用非常关键,体现着Qt的整体设计思想.然而,由于它们比较隐蔽,学习起来比较繁琐,受到人们的忽视.然而,体现设计思想, ...

  9. X分钟速成Y (其中Y=Python3)

    # 用井字符开头的是单行注释 """ 多行字符串用三个引号 包裹,也常被用来做多 行注释 """ ##################### ...

  10. JDBC driver连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than

    出错原因: 因为安装mysql的时候时区设置的不正确. mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用GMT+8:00格式. 也就是说是数据库和系统时区差异所造成的. 验证:运行c ...