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

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,一经查实,立即删除!

相关文章

nj08---process、console

概念:所有属性都可以在程序的任何地方访问,即全局变量。在JavaScript中,通常window是全局对象,而Node.js的全局对象是global,所有全局变量都是global对象的属性,如:console、process等。一、全局…

github1s 油猴插件

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

WPF-02 布局

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

275mib为什么不能联网_大众迈腾(275)MIB之导航使用教程

大众可以说近几年的发展非常快,仅车载收音机都更换了好几代了。从最初的单纯收音机到后来的6碟CD机RCD510,最初国内上市的导航RNS510,还有后来自带蓝牙的RNS315,再到PQ平台187A,当初抄的也火的几乎每天都看到187…

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

本程序用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级左右,提供的下载全然满足大多数人浏览使用,假设用于旅行外出当然级数越高越好,假设是驴行,那就更有必要下载完整的地图以作不时之需。…

0x0000050蓝屏srvsys_蓝屏代码0x00000050的原因及解决方法

经常使用电脑的朋友都知道, 电脑开机 出现蓝屏现象很普遍,相信大家都有遇到过吧?让我们经常的手足无措,不知道接下来应该怎么去操作!那么现在小编汇总起来告诉给大家出现蓝屏代码0x00000050怎么解决的具体内容,先对电脑进行局部的…

​Magicodes.Pay已支持Volo Abp

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

js继承

js继承 一、总结 1、js继承:和c,java不一样,是通过对象冒充, 原型链,混合模式来实现的 2、基础打牢:基础打牢,后面就很轻松 二、js继承 继承继承的相关概念 这里的继承和我们现实生活的中儿子继…

Linux console on LCD

有时候需要将开机启动的信息输出到LCD上,并且在终端上进行调试。本文记录更改的方法。 参考链接 http://blog.csdn.net/chenbang110/article/details/7870072 https://e2e.ti.com/support/embedded/linux/f/354/t/324198 https://blackfin.uclinux.org/doku.php?id…

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

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

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

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

【JS第34期】BOM-window对象

BOM的核心对象是window,它表示浏览器的一个实例。它即是通过javascript访问浏览器窗口的一个接口,也是ECMAScript规定的Global对象。 全局作用域 由于window对象同时是Global对象,因此所有在全局作用域中声明的变量、函数会变成window对象的属性和方法。…

proc文件(OLD)

写一个模块测试proc文件的读写: 1 #include linux/module.h 2 #include linux/kernel.h 3 #include linux/proc_fs.h 4 #include linux/sched.h 5 #include asm/uaccess.h 6 7 #define STRINGLEN 1024 8 9 char global_buffer[STRINGLEN]; 10 11 struct…

java学习(七)java中抽象类及 接口

抽象类的特点: A:抽象类和抽象方法必须用abstract关键字修饰。 B:抽象类中不一定有抽象方法,但是抽象方法的类必须定义为抽象类 c: 抽象类不能被实例化,因为它不是具体的。 抽象类有构造方法,但不能被实例化&#xff1…

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

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

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

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

js监听url变化

//监听触发操作 function hashChangeFire(){alert("k") }//url变化监听器 if( (onhashchange in window) && ((typeof document.documentModeundefined) || document.documentMode8)) {// 浏览器支持onhashchange事件window.onhashchange hashChangeFire; …