多线程:线程通信

线程通信

什么是线程通信

  • 当多个线程共同操作共享的资源时,线程间通过某种方式互相告知自己的的状态,以相互协调,并避免无效的资源争夺。

线程通信的常见模型(生产者与消费者模型)

  • 生产者线程负责生产数据
  • 消费者线程负责消费生产者生产的数据
  • 注意:生产者生产完数据应该等待自己,通知消费者消费;消费者消费完数据也应该等待自己,再通知生产者生产

Object类的等待和唤醒方法

方法名称说明
void wait()让当前线程等待并释放所占锁,直到另一个线程调用notify()方法或者notifyAll()方法
void notify()唤醒正在等待的单个线程
void notifyAll()唤醒正在等待的所有线程

注意 

  • 上述方法应该使用当前同步锁对象进行调用

案例

需求:3个生产者线程,负责生产包子,每个线程每次只能生产一个包子放在桌子上,2个消费者线程负责吃包子,没人每次只能从桌子上拿一个包子吃。

ThreadTest类

public class ThreadTest {public static void main(String[] args) {Desk desk = new Desk();// 创建3个生产者线程(3个厨师)new Thread(() -> {while (true) {desk.put();}},"厨师1").start();new Thread(() -> {while (true) {desk.put();}},"厨师2").start();new Thread(() -> {while (true) {desk.put();}},"厨师3").start();// 创建2个消费者线程(2个吃货)new Thread(() -> {while (true) {desk.get();}},"吃货1").start();new Thread(() -> {while (true) {desk.get();}},"吃货2").start();}
}

Desk类

import java.util.ArrayList;
import java.util.List;public class Desk {public List<String> list = new ArrayList<>();// 放一个包子的方法// 厨师1 厨师2 厨师3public synchronized void put(){try {String name = Thread.currentThread().getName();// 判断是否有包子if (list.size() == 0){list.add(name + "做的肉包子");System.out.println(name + "做了一个肉包子");Thread.sleep(2000);// 唤醒别人,等待自己this.notifyAll();this.wait();}else {// 有包子,不做了// 唤醒别人,等待自己this.notifyAll();this.wait();}} catch (Exception e) {e.printStackTrace();}}// 吃货1 吃货2public synchronized void get() {try {String name = Thread.currentThread().getName();// 判断是否有包子if (list.size() == 1){// 有包子,吃了System.out.println(name + "吃了:" + list.get(0));list.clear();Thread.sleep(1000);this.notifyAll();this.wait();}else {// 没有包子this.notifyAll();this.wait();}} catch (InterruptedException e) {e.printStackTrace();}}
}

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

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

相关文章

对抽象工厂模式的理解

目录 1 背景1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 2 抽象工厂模式3 思考3.1 我的实现3.2 什么时候用抽象工厂模式&#xff1f;&#xff08;怎么用才是合适的&#xff1f;&#xff09;3.3 [更好的例子](https://refactoringguru.cn/design-patterns/ab…

【探索Linux】—— 强大的命令行工具 P.24(网络基础)

阅读导航 引言一、计算机网络背景1. 网络发展历史 二、认识 "协议"1. 网络协议概念2. 网络协议初识&#xff08;1&#xff09;协议分层&#xff08;2&#xff09;OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;&#xff08;3&…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

cobalt strike钓鱼lnk报错:无法连接到远程服务器

笔者在学习 cobalt strike 制作钓鱼文件时发现多次失败&#xff0c;在 win10 虚拟机的 powershell 的多次排查后发现这样一个报错&#xff1a; 使用“1”个参数调用“DownloadString”时发生异常:“无法连接到远程服务器“ 经过多次排查后发现问题出在 cs 的 team server上&…

解决:Glide 在回调中再次加载图片报错

一、问题说明 Glide 加载图片时监听了回调&#xff0c;并在失败时再次加载其它图片后报错。 代码&#xff1a; Glide.with(mContext).load(imgTeacher).listener(new RequestListener<Drawable>() {Overridepublic boolean onLoadFailed(Nullable GlideException e, O…

MCU 串口接收环形缓冲区的实现

环形缓冲区 1. 环形缓冲区的特性 1.先进先出 2. 当缓冲区被使用完&#xff0c;且又有新的数据需要存储时&#xff0c;丢掉历史最久的数据&#xff0c;保存最新的数据 现实中的存储介质都是线性的&#xff0c;因此我们需要做一下处理&#xff0c;才能在功能上实现环形缓冲区 …

[计算机网络]--I/O多路转接之poll和epoll

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、poll函…

web漏洞与规避

文章目录 一、XSS 跨站脚本攻击1.1 XSS攻击的主要类型反射型XSS存储型XSSDOM型XSS 1.2 前端开发如何应对XSS 二、CSRF 跨站请求伪造2.1 CSRF例子2.2 前端开发如何应对CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站脚本攻击 攻击者通过在受害者的…

stm32学习笔记:IIC通信(未完)

概述 第一块&#xff1a;介绍协议规则&#xff0c;然后用软件模拟的形式来实现协议。 第二块&#xff1a;介绍STM32的iic外设&#xff0c;然后用硬件来实现协议。 程序一现象&#xff1a;通过软件I2C通信&#xff0c;对MPU6050芯片内部的寄存器进行读写&#xff0c;写入到配…

【Synchronized同步原理】

Synchronized同步原理 1. synchronized的使用&#xff1f;2. 如何保证线程安全的&#xff1f;3.可重入原理&#xff08;加锁次数计数器&#xff09;4. 原子性和可见性(顺序性) 1. synchronized的使用&#xff1f; 对象锁方法锁类锁 2. 如何保证线程安全的&#xff1f; publi…

关于数据提交上传服务端的数据类型以及项目打包上线的流程

1 请求头的类型&#xff1a; content-type&#xff1b; 01: application/json 数据以json格式请求&#xff1a;{"key":"value"} 02: application/x-www.form-urlencoded from表单的数据格式 name"zs"&age12 03 mutipart/form-data…

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …

飞桨(PaddlePaddle)模型保存与加载教程

文章目录 飞桨&#xff08;PaddlePaddle&#xff09;模型保存与加载教程1. 概述2. 训练调优场景2.1 保存动态图模型2.2 加载动态图模型 3. 推理部署场景3.1 使用基础API 4. 其他场景4.1 旧版本格式兼容载入4.2 静态图模型的保存与加载 5. 总结 飞桨&#xff08;PaddlePaddle&am…

OmniPlan Pro mac版:简单、智能,项目管理新选择!

OmniPlan Pro是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。无论是个人任务还是团队协作&#xff0c;OmniPlan Pro都能提供全面的解决方案&#xff0c;让项目管理变得更加简单高效。 OmniPlan Pro软…

从0开始回顾Mysql --- MySQL初体验

大白话从0开始回顾MySQL&#xff0c;去除了一些繁琐的操作的演示以及内容&#xff0c;如MySQL安装等&#xff0c;本篇文章适合复习MySQL语法&#xff0c;学习MySQL语句&#xff0c;对MySQL不太熟练的同学&#xff0c;希望对大家有一些帮助。 MySQL初体验 首先&#xff0c;我将…

如何在Window系统部署VisualSVN服务并结合cpolar实现无公网ip远程访问

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

数字孪生与智慧交通的融合发展:推动交通行业数字化转型,构建智慧城市新生态

随着信息技术的快速发展和城市化进程的深入推进&#xff0c;交通行业正面临着前所未有的机遇与挑战。传统的交通管理模式已难以满足日益增长的交通需求&#xff0c;而数字化转型则成为了推动交通行业创新发展的必由之路。数字孪生技术作为一种前沿的信息技术手段&#xff0c;为…

聊一聊脑机接口

截至我所知的信息&#xff0c;脑机接口&#xff08;Brain-Computer Interface, BCI&#xff09;技术正在迅速发展&#xff0c;但仍处于相对早期阶段。这一领域的研究涉及神经科学、工程学、计算机科学和人工智能等多个学科。以下是一些关于脑机接口目前进展的要点&#xff1a; …

基于springboot+vue的公寓报修管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

每天的三哥牌小鸡腿没了

查看印度基金(164824)公告&#xff0c;从2024年2月28日起&#xff0c;暂停印度基金的申购&#xff0c;限额100块的一拖七套利告一段落。这意味着看好印度股市的国内投资者&#xff0c;以后只能通过在场内买入获得份额。 关于暂停申购的原因&#xff0c;官方说是为保护基金持有…