Java基础教程——线程通信

线程通信:等待、唤醒

Object方法这些方法在拥有资源时才能调用
notify唤醒某个线程。唤醒后不是立马执行,而是等CPU分配
wait等待,释放锁,不占用CPU资源
notifyAll唤醒全部等待的线程

重点:资源的有效利用

1648799-20190714002305216-1825455207.png

生产一个,消费一个;再生产一个,再消费一个

以热干面为例(生产者消费者问题):

class 热干面 {int isOK = 0;
}
class 生产者 implements Runnable {热干面 m;public 生产者(热干面 m) {this.m = m;}public void 做面() {try {synchronized (m) {if (m.isOK > Desk.BUFFER_MAX) {System.out.println("+等需要做了再做");m.wait();System.out.println("+开始做");}m.isOK++;System.out.println("+做面" + m.isOK);m.notify();}} catch (Exception e) {e.printStackTrace();}}public void run() {while (true) {try {Thread.sleep(Desk.做面时间);} catch (InterruptedException e) {e.printStackTrace();}做面(); // 生产面}}
}
class 消费者 implements Runnable {热干面 m;public 消费者(热干面 m) {this.m = m;}public void 吃面() {try {synchronized (m) {// # 锁住面对象if (m.isOK <= 0) {System.out.println("------等面");m.wait();// 等待,释放锁System.out.println("------有面了");}System.out.println("------吃面:" + m.isOK);m.isOK--;m.notify();// 唤醒另一个线程,但是,俩线程等CPU执行权}} catch (Exception e) {e.printStackTrace();}}public void run() {while (true) {try {Thread.sleep(Desk.吃面时间);} catch (InterruptedException e) {e.printStackTrace();}吃面();}}
}
class Desk {// 为了管理对象、模拟现实场景,可以不要public static final int 做面时间 = 100;public static final int 吃面时间 = 100;public static final int BUFFER_MAX = 1;热干面 msg = new 热干面();生产者 m = new 生产者(msg);消费者 c = new 消费者(msg);Thread t1 = new Thread(m); // 生产者线程Thread t2 = new Thread(c); // 消费者线程public void fn() {t1.start();t2.start();}
}
public class 生产者消费者问题 {public static void main(String[] args) {Desk d = new Desk();d.fn();}
}

转载于:https://www.cnblogs.com/tigerlion/p/11182799.html

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

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

相关文章

cad画直角命令_炸了,CAD fro命令配合tk命令,极轴追踪无敌!

文尾左下角阅读原文看视频教程好课推荐&#xff1a;零基础CAD&#xff1a;点我CAD室内&#xff1a;点我 周站长CAD&#xff1a;点我CAD机械&#xff1a;点我 Bim教程&#xff1a;点我CAD建筑&#xff1a;点我CAD三维&#xff1a;点我全屋定制&#xff1a;点我 ps教程&#xff1…

025 程序的循环结构

目录 一、概述二、遍历循环三、遍历循环的应用3.1 计数循环(N次)3.2 计数循环(特定次)3.3 字符串遍历循环3.4 列表遍历循环3.5 文件遍历循环四、无限循环五、循环控制保留字5.1 break 和 continue5.1.1 for5.1.2 while六、循环的高级用法6.1 循环的扩展6.1.1 for6.1.2 while七、…

灰度值怎么降级_微服务生态的灰度发布如何实现?

前言相信很多小伙伴们都听说过灰度发布&#xff0c;但是不一定知道如何实现&#xff1f;今天我们就介绍一下基本原理&#xff0c;以及提供代码实现给小伙伴们。灰度概念即原来的生产环境是1.0版本&#xff0c;那现在我们需要升级到2.0版本&#xff0c;但是我们需要验证2.0版本&…

在电脑上显示未知发布者怎么办_笔记本电脑显示器花屏怎么办?电脑屏幕花屏的解决方法...

笔记本电脑显示器花屏怎么办&#xff1f;笔记本电脑屏幕花屏该如何解决呢&#xff1f;近日有用户反映在使用笔记本电脑时候&#xff0c;会出现花屏的问题&#xff0c;下面就给大家介绍具体解决方法。一&#xff1a;检查显示器与显卡的连线是否松动若显示屏花屏的话&#xff0c;…

mongodb 字段出现次数_MongoDB数据库

内容回顾Xpath选择器不要求记忆&#xff0c;只要混个眼熟即可基于openpyxl模块爬取豆瓣电影单页爬取多页爬取1.校验请求头里面是否有User-Agent参数 请求头里面加上即可2.限制IP规定时间内的访问次数 1.人为的加上时间延迟 在你的程序里面加上time.sleep()让你的程序间歇一段时…

相似三角形·中考

概述相似&#xff0c;主要是相似三角形&#xff0c;在中考中有举足轻重的地位&#xff0c;难度也较高&#xff0c;往往倒三题中至少有一题是圆和相似的结合相似常常和四边形、反比例函数、圆、二次函数等结合&#xff0c;十分灵活 比例性质 概念若$\displaystyle \frac{a}{b}\f…

php 对接 北向数据接口 socket

function encode($msgType, $timeStamp, $body) {return "\xFF\xFF".pack(CNn, $msgType, $timeStamp, strlen($body)).$body;}$connection->send(encode(1, time(), reqLoginAlarm;userxxx;keyxxx;typexxx)); 详情参考: 请教使用socket做为客户端和北向接口对接&…

RHEL7单独安装图形X11

RHEL7 默认是最小化安装&#xff08;Minimal Install&#xff09;&#xff0c;没有图形界面&#xff0c;我们应该选择Server with GUI。若已错过此步骤&#xff0c;我们采用以下方式补充安装GUI界面。 # yum group list Available Environment Groups:Minimal InstallCompute N…

485通讯线是几芯的_小令老师说门禁| 为什么485门禁必然会取代韦根?

韦根和485&#xff08;RS485&#xff09;是两种不同的通讯协议。通讯协议解决的是通讯双方数据如何传输和如何控制的问题。对于门禁而言&#xff0c;指的是读头和控制器之间的通讯。传统门禁很多采用韦根通讯方式&#xff0c;而现在485更为普及&#xff0c;大部分韦根门禁也完成…

epoll nio区别_大厂面试系列(二)::NIO和Netty

NIO和Netty面试题 NIO 阐述 NIO原理&#xff1f;BIO/NIO/AIO有什么区别&#xff1f;有那些实现&#xff1f;讲讲NIO的原理与实现&#xff1f;NIO用到了哪个经典技术思想&#xff1f;JDK1.8中NIO有做什么优化了解多路复用机制 常见问题 同步阻塞、同步非阻塞、异步的区别&#x…

拦截地址栏参数_selenium操作chrome时的配置参数

参数说明&#xff1a;about:version - 显示当前版本about:memory - 显示本机浏览器内存使用状况about:plugins - 显示已安装插件about:histograms - 显示历史记录about:dns - 显示DNS状态about:cache - 显示缓存页面about:gpu -是否有硬件加速about:flags -开启一些插件 chrome…

升级步骤linux_开发人员福音,在win10系统上安装linux子系统

对于软件开发人员来说&#xff0c;linux基本上是一个绕不过去的槛。 因为工作经常要用到linux&#xff0c;电脑用纯linux还是windows 虚拟机装linux&#xff0c;我一直纠结。因为我要使用docker的原因&#xff0c;所以就搜索到这文章了。如果装个纯linux&#xff0c;则一些win…

curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!

【导语】&#xff1a;Python实现的HTTP请求命令行客户端&#xff0c;我理解为curl的Python版本&#xff0c;但是提供了更友好&#xff0c;更易使用的命令及选项。简介HTTPie是使用Python实现的HTTP命令行工具&#xff0c;提供了更人性化、交互性更好的命令和选项&#xff0c;可…

文件打开特别慢_“Origin进不去、下载慢”的解决办法合集

玩儿烂橘子的游戏&#xff0c;喜闻乐见会见到下面这句话&#xff1a;呃&#xff0c;发生了些意料之外的事情。其实&#xff0c;这还挺意料之中的。▌进不去方法①&#xff1a;挂加速器。加速器挂Steam或者Origin大厅一般是免费的&#xff0c;没效果就换一个节点、模式、加速器。…

关于使用CPU缓存的一个小栗子

一、背景知识 CPU缓存&#xff08;Cache Memory&#xff09;&#xff0c;是位于CPU与内存之间的临时存储器&#xff0c;它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾&#xff0c;因为CPU运算速度要比…

输入快捷键显示未知命令_「干货」华为VRP基础和常用命令了解一下

华为VRP系统的理解手机里面是安卓系统&#xff0c;电脑里面windows系统在我们路由器、交换机、防护墙等网络设备中他们当中的系统就是VRP系统(通用路由平台)可以理解为华为的类型交换机&#xff0c;华为类型路由器以及防火墙他们之间的命令行几乎都是一样华为设备提供丰富的功能…

2 字符串求交集_PostGIS教程十八:维数扩展的9交集模型

一、什么是维数扩展的9交集模型"维数扩展的9交集模型-Dimensionally Extended 9-Intersection Model"&#xff08;DE9IM&#xff09;是一个用于建模两个空间对象如何交互的框架。首先&#xff0c;每个空间对象都具有&#xff1a;内部&#xff08;interior)边界&#…

房子里的K2 BPM业务流程管理

房…子这件事上&#xff0c;尴尬实在太多。 ಥ_ಥ 职场新人&#xff0c;租房很尴尬&#xff1b; 未婚男女&#xff0c;婚房很尴尬&#xff1b; 有下一代的&#xff0c;学区房很尴尬&#xff1b; 耄耋之年&#xff0c;养老房很尴尬... ▽ 甭管买房、租房、装修、设计&#xff0c…

大学生体测成绩判断c语言_体育改革瞄准高校,体测不过关可能真的毕不了业了...

「ECO氪体」体育圈人www.ecosports.cn文/ 圈哥回忆上学期间&#xff0c;体育最令你头疼的时刻是什么&#xff1f;是不是在体育中考将要到来之前&#xff0c;还没日没夜枯燥的训练和近乎苛刻的饮食控制&#xff1f;而现在&#xff0c;体育似乎不想再局限于中学了。图片截自&…

gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号

在SWMM中&#xff0c;管线需要输入上下游节点检查井编号&#xff0c;那么在GIS中可否实现自动获取上下游节点编号呢&#xff1f;思路是这样的&#xff0c;首先获得管线两端节点&#xff0c;然后对端点进行融合&#xff0c;删除重复的节点&#xff0c;最后根据坐标关系分别建立管…