生产者与消费者

生产者消费者问题属于 java 的多线程同步问题,因为涉及多线程之间对同一个资源的访问与操作,java 提供了 wait(),notify(),notifyAll() 等方法来实现多线程之间的同步问题。

生产者

负责对同一资源的生产增加操作。先判断资源数量是否已经达到最大值,如果没有达到则生产资源并调用 notifyAll() 唤醒其他线程;如果有达到则调用对象的 wati() 方法进入阻塞状态,等待被其他线程唤醒。

消费者

负责对同一资源的消费减少操作。先判断资源数量是否已经为 0,如果没有达到则消费资源并调用 notifyAll() 唤醒其他线程;如果有达到则调用对象的 wait() 方法进入阻塞状态,等待被其他线程唤醒。

夜王与守夜人
以权力的游戏里的夜王和守夜人为例,夜王就是一个生产者,负责生产异鬼;而守夜人就是一个消费者,负责消灭异鬼;异鬼就是他们之间共同操作的资源。

示例代码:

package multithreading;/*** 权力的游戏之夜王与守夜人之间的战争*/
public class GofTest {public static void main(String[] args) {// 初始化异鬼WhiteWalker whiteWalker = new WhiteWalker();// 夜王诞生Runnable nightKing = new NightKing(whiteWalker);// 守夜人出场Runnable nightWatch = new NightWatch(whiteWalker);// 夜王开始行动new Thread(nightKing).start();// 守夜人跟上new Thread(nightWatch).start();// 夜王开始行动new Thread(nightKing).start();// 守夜人跟上new Thread(nightWatch).start();// 夜王开始行动new Thread(nightKing).start();// 守夜人跟上new Thread(nightWatch).start();}
}/*** 异鬼类*/
class WhiteWalker {/*** 数量*/private static Integer count = 0;/*** 最多 10 个*/private static final Integer MAX = 10;/*** 北境长城(锁对象)*/private static Object greatWall = new Object();/*** 生产夜鬼*/public void create() {// 北境长城作为锁对象synchronized (greatWall) {// 判断异鬼是否已经满了while (count == MAX) {try {// 如果满了,则停止生产,进入阻塞greatWall.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 如果没满,则生产count++;System.out.println(Thread.currentThread().getName() + "夜王生产者生产异鬼,目前共有" + count);// 提醒守夜人消费者消费,唤醒所有线程greatWall.notifyAll();}}/*** 杀异鬼*/public void kill() {// 北境长城作为锁对象synchronized (greatWall) {// 判断异鬼是否已经杀完while (count == 0) {try {// 杀完则等待,线程阻塞greatWall.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 如果没杀完,则杀之count--;System.out.println(Thread.currentThread().getName() + "守夜人消费者杀异鬼,目前共有" + count);// 唤醒所有线程,昭告天下,消灭了异鬼greatWall.notifyAll();}}
}/*** 夜王生产者类,实现 Runnable,负责生产异鬼*/
class NightKing implements Runnable {private WhiteWalker whiteWalker;public NightKing(WhiteWalker whiteWalker) {this.whiteWalker = whiteWalker;}@Overridepublic void run() {// 调用 10 次for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 召唤异鬼this.whiteWalker.create();}}
}/*** 守夜人消费者类,实现 Runnable,负责杀死(消费)异鬼*/
class NightWatch implements Runnable {private WhiteWalker whiteWalker;public NightWatch(WhiteWalker whiteWalker) {this.whiteWalker = whiteWalker;}@Overridepublic void run() {// 调用 10 次for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 消灭异鬼this.whiteWalker.kill();}}
}

测试输出:

Thread-2夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-4夜王生产者生产异鬼,目前共有2
Thread-1守夜人消费者杀异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-2夜王生产者生产异鬼,目前共有2
Thread-5守夜人消费者杀异鬼,目前共有1
Thread-4夜王生产者生产异鬼,目前共有2
Thread-1守夜人消费者杀异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-0夜王生产者生产异鬼,目前共有2
Thread-3守夜人消费者杀异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-0夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-2夜王生产者生产异鬼,目前共有2
Thread-1守夜人消费者杀异鬼,目前共有1
Thread-5守夜人消费者杀异鬼,目前共有0
Thread-4夜王生产者生产异鬼,目前共有1
Thread-0夜王生产者生产异鬼,目前共有2
Thread-5守夜人消费者杀异鬼,目前共有1
Thread-1守夜人消费者杀异鬼,目前共有0
Thread-2夜王生产者生产异鬼,目前共有1
Thread-3守夜人消费者杀异鬼,目前共有0

生产者与消费者(夜王与守夜人之间的斗争)相关推荐

  1. kafka中生产者和消费者的分区问题

    本文来书说下kafka中生产者和消费者的分区问题 文章目录 概述 主题的分区数设置 分区与生产者 分区与消费者 range roundrobin(轮询) 本文参考 本文小结 概述 我们知道,生产者发送 ...

  2. Java多线程2.3.生产者与消费者之间的关系2

    生产者与消费者之间的关系 1.线程间通信问题描述图 2.线程的状态转换图及常见执行情况 3.等待唤醒机制思路图解 4.线程的生命周期

  3. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  4. python生产和消费模型_python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...

  5. 线程通信问题--生产者和消费者问题

    一.问题引入:首先实现一个线程通信的实例,使用两个线程交替打印输出100以内的数字. 代码实现如下: 1 package com.baozi.exer; 2 3 public class Commun ...

  6. Java多线模式-Producer-Consumer模式(生产者、消费者模式)

    1.场景 有些时候需要两个或两个以上的线程协同工作,每个线程需要使用其他线程产生数据. 2.详细说明 可以把上面的场景抽象成生产者和消费者模式.从消费者的角度:消费者需要消费生产者生成的产品. 从生产 ...

  7. 生产者,消费者,CDN

    1 生产者消费者模型应用场景及优势? 什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进 ...

  8. Jmeter之创建Kafka生产者和消费者进行性能测试

    目录 1. A Brief Overview of Apache Kafka 2. Pepper-Box Serialized Config 3. Pepper Box Kafka Sampler 4 ...

  9. java的知识点34——线程通信 || 生产者与消费者问题

    线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...

最新文章

  1. PHP中的PathInfo
  2. python怎么导入包-python怎样导入包
  3. 计算机与人脑_看!自行车成精了...清华网红自行车:拥有“类人脑芯片”,可无人驾驶...
  4. oracle 斜线出现次数,oracle一些操作小知识
  5. hi3519av100 2.0版本sdk编译提示 cannot find uuid library required for mkfs.ubifs
  6. For the king:出色的冒险,失败的角色扮演
  7. Mysql重置初始密码的方法
  8. 线段树POJ3468(成段更新,区间求和)
  9. java中写sql语句的小小细节
  10. Sublime Text 模板插件SublimeTmpl
  11. ajax和jquery教程pdf,ajax和jquery教程pdf
  12. 电脑重装系统记事本打不开提示无法启动此应用程序怎么办
  13. 不同调制方式的PWM谐波分析
  14. 三种技术类型的3D摄像头大体总结 3D人脸识别
  15. Scrapy库的安装,Scrapy爬虫框架简介
  16. 曾抵押房子炒币、与老婆差点离婚! 如今这位80后中科院博士竟...
  17. Thread-Specific Data(线程私有数据)
  18. 奔腾处理器_编号和非编号的奔腾处理器之间有什么区别?
  19. Flutter的菜鸟教程
  20. java机器学习库_6大最常用的Java机器学习库一览

热门文章

  1. 轻量级Kubernetes之k3s:2:使用docker作为容器运行环境
  2. 目标检测 YOLOv5 - 卷积层和BN层的融合
  3. 全国计算机考试cad,国家CAD考试CAD试题库.pdf
  4. 动手学深度学习(二十六)——图像增广(一生二,二生三,三生万物?)
  5. 黑群晖(XPEnology)无法启动重建系统并保留数据经验总结
  6. Springboot之Actuator信息泄露漏洞利用
  7. 牛客算法周周练14 BCircle D 绝地求生(gcd,思维) E
  8. 产品:关键词与分类---人人都是产品经理day02
  9. 利用VISA协议控制信号发生器by Delphi7
  10. 虚拟机打开安卓模拟器VT