JAVA-生产消费者模型

2023-05-16

简单介绍一下生产消费者模型,如下图:

一般来说,生产消费者模型就是消费者和生产者可以共同操作茶叶仓库这一个共享资源 。打一个比方,生产者生产茶叶供向茶叶市场,消费者在茶叶市场购买茶叶,其中茶叶市场上的茶叶量就是一个共享资源。生产者生产了茶叶就可以让消费者来消费,并且消费者发现茶叶市场没茶了就让生产生产,这是共享资源的一种方式。

在多线程的情况下 ,对共有资源的操作安全性就显得尤为重要,首先我们要对消费者、生产者和仓库进行上锁处理。

消费者:

先拿到仓库的锁,进入仓库,查看仓库中是否有货,有,可进行购买,然后释放仓库锁;如果没有货,通知生产者生产货物,释放仓库锁。

生产者:

进入仓库查看仓库库存是否已满;已满,通知消费者消费,自己进入等待状态,释放仓库锁,未满,生产产品并唤醒消费者,然后释放锁。

仓库:

具有仓库容量的属性,因为是共有资源,还需要加锁,避免出现线程安全问题。

另外为了实现该模型还需用到线程的两个状态:

wait() 会执行该方法的当前的线程进入等待状态 ;
notifyAll() 唤醒所有被wait()的线程

代码如下:

消费者

package com.thread.v5;

public class Consumer implements Runnable{
	private WareHouse wareHouse;
	public Consumer() {
		// TODO Auto-generated constructor stub
	}
	
	public Consumer(WareHouse wareHouse) {
		super();
		this.wareHouse = wareHouse;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			try {
				Thread.sleep(3000);
				wareHouse.consume();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

生产者

package com.thread.v5;

public class Producer implements Runnable{
	private WareHouse wareHouse;
	
	public Producer() {
		// TODO Auto-generated constructor stub
	}
	
	
	public Producer(WareHouse wareHouse) {
		super();
		this.wareHouse = wareHouse;
	}


	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			try {
				Thread.sleep(1000);
				wareHouse.produce();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

仓库及main方法

package com.thread.v5;

import java.util.LinkedList;

public class WareHouse{
	private int MAX_SIZE = 10;
	private LinkedList<Object> list = new LinkedList<>();
	public static void main(String[] args) {
		WareHouse wareHouse = new WareHouse();
		//消费者
		Thread c1 = new Thread(new Consumer(wareHouse));
		Thread c2 = new Thread(new Consumer(wareHouse));
		Thread c3 = new Thread(new Consumer(wareHouse));
		//生产者
		Thread p1 = new Thread(new Producer(wareHouse));
		Thread p2 = new Thread(new Producer(wareHouse));
		Thread p3 = new Thread(new Producer(wareHouse));
		
		c1.start();
		c2.start();
		c3.start();
		
		p1.start();
		p2.start();
		p3.start();
	}
	
	public void produce() {
		synchronized (list) {
			while(list.size() + 1 > MAX_SIZE) {
				System.out.println("生产者"+Thread.currentThread().getName()+
						"仓库已满");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			list.add(new Object());
			System.out.println("生产者"+Thread.currentThread().getName()+
					"生产一个产品,现库存"+list.size());
			list.notifyAll();
		}
	}
	public void consume() {
		synchronized (list) {
			while(list.size() == 0) {
				System.out.println("消费者"+Thread.currentThread().getName()
						+"仓库为空");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			list.remove();
			System.out.println("消费者"+Thread.currentThread().getName()+
					"消费一个产品,现库存"+list.size());
			list.notifyAll();
		}
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA-生产消费者模型 的相关文章

  • C++判断是否是IP地址

    判断是否是IP地址 bool isIPAddress const char s const char pChar bool rv 61 true int tmp1 tmp2 tmp3 tmp4 i while 1 i 61 sscanf s
  • C++判断是否是纯数字

    C 43 43 判断是否是纯数字 bool isDigitStr const char cstr if NULL 61 61 cstr cstr 0 61 61 0 return false int len 61 strlen cstr i
  • 命里有时终须有,命里无时莫强求

    命里有时终须有 xff0c 命里无时莫强求 今天是2012年2月24号 xff0c 和我谈了3个多月的女生突然之间说我们之间不合适 xff0c 让我以后不要再去骚扰她 真心第一次体会到失恋的感觉 xff0c 同时打电话给我姐姐诉说了下 xf
  • 共享内存--函数

    共享内存允许两个不相关的进程访问同一个逻辑内存 共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式 大多数的共享内存的具体实现 xff0c 都把由不同进程之间共享的内存安排为同一段物理内存 共享内存是由IPC为进程创建的一个特殊
  • GNOME 3 介绍 技巧

    https wiki archlinux org index php GNOME 28 E7 AE 80 E4 BD 93 E4 B8 AD E6 96 87 29 GNOME项目使用最新的科技 xff0c 为用户从头打造了全新的现代桌面
  • assert用法

    判断是否为真 include 34 stdio h 34 include lt string h gt include lt stdlib h gt define NDEBUG include lt assert h gt void mai
  • strcpy原型

    已知strcpy 函数的原型是 char strcpy char strDest const char strSrc 其中strDest 是目的字符串 xff0c strSrc 是源字符串 xff08 1 xff09 不调用C 43 43
  • new与delete正确用法

    说明 xff1a 推荐使用如下宏 xff0c 可以在一定程度上避免使用空指针 xff0c 野指针的问题 define HW NEW var classname do try var 61 new classname catch var 61
  • VNC启动gnome或者KDE

    VNC xstartup程序中默认的设定值可以启动twm xff0c 而不是GNOME或KDE 默认配置文件为 HOME vnc xstartup HOME 是用户目录 如下 gnome桌面的配置文件如下 xff1a bin sh Unco
  • crontab执行java -jar不成功

    一个程序经常挂掉 xff0c 不想人为的一种手动重启 故写了一个脚本 xff0c 定时查看程序是否存在 xff0c 不存在就重启 但是过程中一直crontab 设置的定时器一直不执行 crontab e 1 opt speak start
  • crontab 解决周期内未执行完重复执行

    crontab 解决周期内未执行完重复执行 crontabphplock crontab 执行 php 脚本 linux 下的 crontab 定时任务服务 xff0c 可以用来定时运行脚本 工作中经常会用到这样的服务 xff0c 使用起来
  • Kali Linux 2020 VNC设置自动开机启动

    前提 大家好 目前最新版kali Linux 2020离线包貌似已经取消了桌面安装了 xff0c 需要自己去手动安装桌面 xff0c 所以如果你还是命令行 xff0c 那你就先安装个桌面再说 xff0c 怎么装自己去百度 VNC安装过程 首
  • http://wwwnno00.irrlicht3d.cn:8011/forum-20-3.html

    http wwwnno00 irrlicht3d cn 8011 forum 20 3 html
  • git guest reporter

    权限列表如下 xff1a ActionGuestReporterDeveloperMasterOwnerCreate new issue Leave comments Pull project code Download project C
  • 元素化学期末(考点)整理

    元素化学 期末 xff08 考点 xff09 整理 作者 xff1a gjq 转载或引用需联系作者 xff0c 欢迎给作者打钱 xff01 2019年期末考题请联系作者 xff0c 作者微信 xff1a photon gjq xff0c q
  • 关于ubuntu自启动(rc.local,/etc/rcx.d软连接,创建自定义service)

    ubuntu自启动 xff08 总结 xff09 前言方法一 xff1a 编辑etc rc local方法二 xff1a rcx d 下添加脚本方法三 xff1a 创建service 前言 日常工作中难免碰到需要让某些应用程序自启动的功能
  • springMVC+mybatis环境搭建

    web xml文件配置 lt 加载Spring容器配置 gt lt 设置Spring容器加载所有的配置文件的路径 gt lt context param gt lt param name gt contextConfigLocation l
  • 解决 https 无法访问

    本人腾讯云服务器 xff0c 放假上班打开宝塔面板 xff0c 结果无法访问 我想着重启实例 xff0c 结果面板可以打开 xff0c 但是域名打不开了 xff08 之前是可以打开的 xff09 最后在这个地址找到了答案 xff0c 记录一
  • Python程序设计 简单的图像处理(1)

    Python程序设计 简单的图像处理 xff08 1 xff09 1 写个滤镜 照片照的好 xff0c 不如滤镜用得好 xff01 一款好的滤镜软件可以让照片呈现不一样的风格乃至风情 xff0c 修理照片需要扬长避短达到最佳效果 可是滤镜款
  • Xcode操作流

    1 Xcode IDE概览 说明 xff1a 从左到右 xff0c 依次是 导航窗格 xff08 Navigator xff09 gt 边列 xff08 Gutter xff09 gt 焦点列 xff08 Ribbon xff09 gt 代

随机推荐

  • java gui 多线程,界面假死、僵死问题

    xff08 转载1 xff09 楼主bluepb xff08 流星 xff09 2005 06 04 20 28 17 在 Java GUI 设计 提问 我现在在用jAVA做图形化设计 xff0c 想问个多线程的问题 比如在一个窗口上点个按
  • excel数据对比-----查找两列(表)的相同数据

    原创作品 xff0c 允许转载 xff0c 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http xueli blog 51cto com 3325186 920592 现有两个excel表 xff0c
  • discuz 微社区 您请求的XXXX无法访问 接口错误(ERR02)

    我遇到的情况 xff1a 1 UC可以访问页面 xff0c 用微信报错 2 4G网络下可以访问 xff0c WiFi网络下报错 网上有两种解决方法 xff1a 1 关闭防采集 xff0c 我最终的采用方法 2 default下的mobile
  • 所有文件夹都变成1KB文件夹快捷方式病毒的手动清除方法

    电脑差不多都因使用U盘而感染了病毒 xff0c 其中一个就是Autoran病毒的变种 xff0c 它的症状我就不再描述了 xff0c 另外一个病毒的症状是所有文件夹都变成了1KB文件夹快捷方式 xff0c 各盘无法双击打开 xff08 但右
  • 搜狗高速浏览器2.0使用体验

    2010年 4 月 8 号 xff0c 我们终于迎来了 国内浏览器的后起之秀搜狗高速浏览器2 0 正式版 的 发布 高速真双核引擎 的概念得到了落实 它新增并改进了诸多功能 xff0c 修改了一些bug xff0c 从整体提高 搜狗高速浏览
  • Connection refused错误

    这个问题整了我两天时间 xff0c 现在终于解决了 问题 xff1a 用php 构造http请求访问自身web服务器页面 xff0c 总是报Connection refused 111 错误 显示 xff1a unable to conne
  • QT样式表从入门到精通

    QT样式表从入门到精通 文章目录 QT样式表从入门到精通前言1 背景介绍2 初级学习2 1 34 盒子 34 模型2 2 语法说明2 3 基础控件2 4 控件状态表2 5 选择器 3 中级学习3 1 坐标讲解3 1 1 相对坐标3 1 2
  • GIF89a图片头文件欺骗

    1 什么是GIF89a 一个GIF89a图形文件就是一个根据图形交换格式 xff08 GIF xff09 89a版 xff08 1989年7 月发行 xff09 进行格式化之后的图形 在GIF89a之前还有87a版 xff08 1987年5
  • txt文件导入mysql

    LOAD DATA LOW PRIORITY CONCURRENT LOCAL INFILE 39 file name 39 REPLACE IGNORE INTO TABLE tbl name CHARACTER SET charset
  • mac下终端无法使用数字小键盘的解决方案

    终端下 偏好设置 xff0d 高级 xff0d xff08 去掉 xff09 允许VT100应用程序小键盘模式
  • Mac Eclipse Failed to load JavaHL Library.

    转自 xff1a http blog csdn net wy10207010219 article details 42294293 写这一篇前我想发表一下感慨 xff1a 你所害怕的事 xff0c 你想要逃避的事 xff0c 在将来的某个
  • ROS学习笔记(一)ROS安装和helloworld

    ROS学习笔记 xff08 一 xff09 ROS安装和helloworld 文章目录 一 ros安装及测试1 打开ubuntu软件和更新 xff0c 进行如下设置2 设置安装源3 设置安装密钥4 更新软件源5 安装ros6 添加命令7 初
  • 使用ActiveMQ进行C++与C#的通信4 - 使用C++连接ActiveMQ

    在上一节编译ActiveMQ CPP的基础上 xff0c 创建C 43 43 控制台应用程序 xff0c 将activemq cpp项目中的include文件夹拷贝到该C 43 43 项目中 xff0c 设置好附加包含目录 将生成好的lib
  • 使用ActiveMQ进行C++与C#的通信5 - 实现C++和C#的通信

    在前几篇文章分别实现C C 43 43 连接ActiveMQ的基础上 xff0c 本文介绍如何使它们通信 使不同的进程对同一个ActiveMQ消息队列进行访问 xff0c 就能够达到消息互通的效果 例如使用queue test1 log作为
  • 【计算机游戏开发】游戏交互界面设计

    github项目地址 一 实验目的与要求 熟悉交互界面设计原理 了解Cocos2d x中的用户交互 触摸事件 碰撞检测机制 二 实验内容与方法 完成游戏编译 50分 仿照实验一 英雄快跑 实验 xff0c 将教材源码和素材文件复制到自己的项
  • k-近邻实现手写数字识别

    1 k 近邻工作原理 简单地说 xff0c K近邻算法采用测量不同特征值之间的距离方法进行分类 该算法具有一下特点 优点 xff1a 精度高 对异常值不敏感 无数据输入假定 缺点 xff1a 计算复杂度高 空间复杂度高 K近邻算法的工作原理
  • selenium之CSS定位

    一 层级定位 1 xff1a 所有标签 2 标签名 xff1a 查找所有该标签名 3 标签名 xff0c 标签名 xff1a 查找多个标签名 id用 表示 索引尽量使用xpath 二 三大等待和切换 1 页面元素可以定位 xff0c 但是代
  • STM32核心笔记

    STM32核心笔记 文章目录 STM32核心笔记1 下载程序的两种方式1 1 串口ISP1 2 仿真器1 2 1 J Link1 2 1 ST LINK 2 认识寄存器3 地址总线与外设地址映射关系4 GPIO的三种配置5 时钟树6 常用中
  • 用efibootmgr管理UEFI启动项,添加丢失的启动项

    UEFI用来替代传统BIOS引导操作系统 xff0c 学会修改UEFI启动项也变得十分重要 xff0c UEFI全称为 xff1a 统一的可扩展固件接口 xff08 Unified Extensible Firmware Interface
  • JAVA-生产消费者模型

    简单介绍一下生产消费者模型 xff0c 如下图 xff1a 一般来说 xff0c 生产消费者模型就是消费者和生产者可以共同操作茶叶仓库这一个共享资源 打一个比方 xff0c 生产者生产茶叶供向茶叶市场 xff0c 消费者在茶叶市场购买茶叶