多线程-单生产单消费模型

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

创建资源对象,提供保存和取出方法(使用synchronized代码块实现)

/*** Created by shaoqinghua on 2018/5/3.* 定义一个负责保存和取出的资源类*/
public class Resource {/*** 定义成员变量,充当保存和取出的容器*/private Object[] objs = new Object[1];/*** 定义一个同步的锁对象*/private Object lock = new Object();/*** 保存数据*/public void save(Object obj) {synchronized (lock) {if (objs[0] != null) {//存在数据,保存线程不能执行保存操作,需要等待try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}objs[0] = obj;System.out.println(Thread.currentThread().getName() + " 正在保存的数据:" + objs[0]);//在生产者保存完数据后,需要唤醒消费线程lock.notify();}}/*** 取出数据*/public void get() {synchronized (lock) {if (objs[0] == null) {//没有数据,无法取出,需要等待try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "正在取出的数据:::::::" + objs[0]);objs[0] = null;//消费结束,需要通知生产者线程lock.notify();}}}

创建生产者任务类

/*** Created by shaoqinghua on 2018/5/3.*/
public class Productor implements Runnable {private Resource r;public Productor(Resource r) {this.r = r;}@Overridepublic void run() {//给资源仓库保存数据while (true) {r.save("汽车");}}
}

创建消费者任务类

/*** Created by shaoqinghua on 2018/5/3.*/
public class Consumer implements Runnable {private Resource r;public Consumer(Resource r) {this.r = r;}@Overridepublic void run() {//从资源仓库取出数据while (true) {r.get();}}
}

测试类

/*** Created by shaoqinghua on 2018/5/3.* 测试单生产单消费*/
public class ThreadTest {public static void main(String[] args) {//创建资源对象Resource r = new Resource();//创建线程任务对象Productor pro = new Productor(r);Consumer con = new Consumer(r);//创建生产和消费的线程对象Thread t = new Thread(pro);Thread t2 = new Thread(con);//启动线程t.start();t2.start();}
}

另外,Resource资源类也可使用JDK5之后的Lock和Condition实现

/*** Created by shaoqinghua on 2018/5/3.* 定义一个负责保存和取出的资源类*/
public class Resource {/*** 定义成员变量,充当保存和取出的容器*/private Object[] objs = new Object[1];/*** 定义JDK5之后的Lock锁*/private Lock loc = new ReentrantLock();/*** 定义监视生产者线程的等待和唤醒对象*/private Condition proCon = loc.newCondition();/*** 定义监视消费者线程的等待和唤醒对象*/private Condition conCon = loc.newCondition();/*** 保存数据*/public void save(Object obj) {//手动获取锁对象loc.lock();try {if (objs[0] != null) {//存在数据,保存线程不能执行保存操作,需要等待try {proCon.await();} catch (InterruptedException e) {e.printStackTrace();}}objs[0] = obj;System.out.println(Thread.currentThread().getName() + " 正在保存的数据:" + objs[0]);//在生产者保存完数据后,需要唤醒消费线程conCon.signal();} finally {//手动释放锁对象loc.unlock();}}/*** 取出数据*/public void get() {//手动获取锁对象loc.lock();try {if (objs[0] == null) {//没有数据,无法取出,需要等待try {conCon.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "正在取出的数据:::::::" + objs[0]);objs[0] = null;//消费结束,需要通知生产者线程proCon.signal();} finally {//手动释放锁对象loc.unlock();}}
}

 

转载于:https://my.oschina.net/LaravelShao/blog/1807245

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github1s 油猴插件

github1s 是一个非常有趣的项目,它可以让你在 1 秒内(俗称 1s)通过在线版本的 VS Code 来打开 GitHub 上的代码,只需要在对应项目的 URL 后面加上 1s 即可。 这是一个很有创意、很赞的项目,只需要在对应的 GitHub 项目…

WPF-02 布局

WPF中布局控件继承Panel,可以实现非常复杂的布局。我们介绍一下常用的布局控件1. Grid 布局控件Grid是网格布局控件,在WPF开发中我们用的最多的一个布局控件,可以自定义行和列,分别设置Height和Witdh值,一般推荐通过比…

微信多开工具 可以同时在电脑上打开多个微信 免费开源

本程序用C#代码编写,运行环境FrameWork5.0以上。 主要代码: using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using Sys…

Linux 第十周学习笔记(2)smtp服务的部署

SMTP服务的部署介绍:SMTP(Simple Mail Transfer Protocol)简单邮件传输协议是一种提供可靠且有效电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。一.环境的部署…

关于CTeX的几个大坑

https://blog.csdn.net/zjutczj/article/details/53463478 最近一直忙着写小论文,毕业设计中期答辩,没有更新博客,忙过这一阵我会把这段时间学习机器学习的一些心得分享。今天分享几个刚刚使用CTeX遇到的大坑,希望能挽救一些还没有…

西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级

西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级 一般来说商业用图几乎相同就是17级左右,提供的下载全然满足大多数人浏览使用,假设用于旅行外出当然级数越高越好,假设是驴行,那就更有必要下载完整的地图以作不时之需。…

​Magicodes.Pay已支持Volo Abp

简介Magicodes.Pay希望打造一个统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core。目前已提供Abp及Abp VNext模块的封装,支持开箱即用。主要功能目前已提供Abp(含Abp VNext)模块的封装&#xf…

vscode 头文件包含问题_WSL+VSCode = Linux ?

官方文档​code.visualstudio.com使用VSCode新推出的Remote功能来连接WSL或服务器进行开发. 可以在Windows上享受优秀的界面体验的同时使用Linux环境进行开发(还是要感谢无数的VSCode插件贡献者).环境基础配置Visual Studio Code最新版本注意点: 安装时需要勾选环境变量添加到p…

PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结…

手机的小窗口怎么弄_荣耀9X如何设置桌面小工具?划重点,这个要考

为了方便手机操作,一些小伙伴会在手机桌面上添加天气、一键锁屏、日历等窗口小工具,那么问题来了!荣耀9X这款新手机是如何添加窗口小工具呢?官维君今天就来给大家讲解一下方法。标准姿势看这里——第一步:在桌面双指头…

ASP.NET Core 同时支持多种认证方式 | Swagger 支持

前言上次,我们实现了《ASP.NET Core 同时支持多种认证方式》:services.AddAuthentication().AddDemoAuthentication(options > { }).AddJwtBearer(options >{...});我们还希望为 Swagger 也添加多种认证支持。原来为支持 JWT 认证,Swag…

Redis指南

一、简介 redis 和 memcached 都是高性能的键值缓存数据库服务,其中 memcached 支持多线程,而 redis 支持丰富的数据结构且能内置持久化机制。 redis 数据都是以键值形式存储的,键是字符串类型,值有 7 种类型(本质上是…

SpringIOC之AbstractMessageSource

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

【实战】手把手教你从 0 到 1 搭建一套 RocketMQ 集群

大家好,我是君哥。今天来分享怎样搭建 RocketMQ 集群。本文搭建集群使用的环境是 2 个云主机,架构如下:在 47.xx.xx.xx 和 39.xx.xx.xx 上分别部署一个 Name Server 和 Broker 主节点,这里不搭建从节点。也就是官网介绍的 2m-nosl…

敏捷制造:并不是你想像的矛盾体

\关键点\敏捷制造使企业能够比传统制造方式更快更有效地取悦客户 \敏捷方法实际上是为制造而不是软件而开发的 \敏捷制造需要从上到下的数字视角和承诺 \敏捷制造需要新的技能,还需要授权、扁平化合作和贯穿整个组织的沟通 \迈向敏捷制造的第一步可以是通过升级传统…

上海一趟,我陷入了沉思

hi,这里是桑小榆。2022年8月20日,我去了一趟上海,交了很多新朋友,和各行业且具备独立思考的伙伴交流了很多,也吸收了很多的新东西。此篇我将分享我的感悟,并以自己的角度剖析存在的问题。痛苦与症状在此之前…

Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件

为什么80%的码农都做不了架构师?>>> Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件 http://www.swiper.com.cn/ 转载于:https://my.oschina.net/huqiji/blog/800482

vue实现todo功能(一):搭建vue-webpack环境

前言 我最开始因为项目原因接触的是react,对于我这种美观狂而言,react中难以调解的css让我十分抓狂,说是在写页面,因为不能写自己的样式,像是在拼凑页面,没意思。于是我开始了解vue这种将css html javacrip…

单模光电转换器怎么接_以太网光纤收发器怎么用?

以太网光纤收发器有单模、多模,单纤、双纤,百兆、千兆,电信级和工业级品质,稳定可靠,是网络高清监控优选设备。那么,以太网光纤收发器怎么用呢?接下来就由飞畅科技的小编来为大家详细介绍下以太…

WPF效果第一百九十六篇之彩色马蹄形图

上一篇又是基于ListBox改了改模板实现了点不一样的效果;今天来分享一点这些天一直摸索的好玩的效果;闲话不多扯直接看效果:1、对于各种定义就直接看下面:https://www.wigglepixel.nl/en/blog/what-are-color-spaces-color-profiles-and-gamma-correction2、关于马蹄图我找到了S…