线程通信

  1. 生产者和消费者问题

    1. 共享同一个资源,需要线程同步:synchronized
    2. 两者相互依赖,需要线程通信:wait()、notify()
  2. wait()、notify()

    1. 解决线程通信

    2. 每个对象都有锁,因此是Object类的方法

    3. 只能在同步方法和同步代码块中使用,否则会抛出异常IllegalMonitorStateException

    4. wait()和notify()应该成对出现,不是说在一个方法里成对,而是分布在不同的方法里

    5. 为了防止有的线程太快,wait()让他停下来,等到慢的线程赶上了,再notify()快的线程,而且二者都有可能,所以要有两对

      方法 注意
      wait() 一直等待,直到其他线程唤醒,与sleep()不同,会释放锁
      wait(long timeout)
      notify() 唤醒一个处于等待状态的线程
      notifyAll() 唤醒所有,优先级高的优先调度
  3. 解决方式

    1. 管程法:新建一个缓冲区类,存放产品。生产者将生产的数据放入缓冲区,消费者从缓冲区拿数据
    2. 信号灯法:产品本身设置一个标志位flag

管程法

class Producer extends Thread{SynContainer synContainer;public void run() {synContainer.produce(new Chicken(i));}
}
class Consumer extends Thread{SynContainer synContainer;public void run() {synContainer.consume();}
}
// 产品
class Chicken {}
// 缓冲区(新建一个缓冲区类)
class SynContainer {// 容器大小为10Chicken[] chickens = new Chicken[10];// 计数器int count;// 生产者放入产品synchronized void produce(Chicken chicken) throws InterruptedException {// 判断是否满了if ((count == chickens.length)){wait();}// 没满,放入产品chickens[count++] = chicken;System.out.println("生产了一只鸡" + chicken.id);// 通知消费者消费notifyAll();}// 消费者消费产品synchronized void consume() throws InterruptedException {// 判断缓冲区是否有值if (count == 0){wait();}// 有值,就消费Chicken chicken = chickens[--count];System.out.println("消费了" + chicken.id);// 通知生产者生产notifyAll();}
}

信号灯法

class Actor extends Thread{TV tv;public void run() {tv.perform("快乐大本营播放中");}
}
class Audience extends Thread{TV tv;public void run() {tv.watch();}
}// 产品,自身设置一个标志位
class TV{String voice;boolean flag = false;// 表演synchronized void perform(String voice) throws InterruptedException {if (flag){wait();}this.voice = voice;System.out.println("演员表演了:"+voice);flag = true;notifyAll();}// 观看synchronized void watch() throws InterruptedException {if (!flag){wait();}System.out.println("观众观看了:"+voice);voice = null;flag = false;notifyAll();}
}

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

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

相关文章

manim边做边学--淡入淡出变换

今天介绍Manim中用于淡入淡出变换的3个动画类:FadeToColor:聚焦于对象颜色的平滑转换,通过渐变增强视觉效果 FadeTransform:实现不同对象之间的渐变替换,让元素转换更加连贯 FadeTransformPieces:突出将对象碎片化并对各部分单独变换,适用于复杂物体的分解重组这三者都在…

抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞

抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞 代码链接不说废话,上代码!!! get.py # get.py import urllib.request import urllib.error import urllib.parse import json# 抓取网易云音乐指…

快手HoME多任务论文

论文链接:HoME: Hierarchy of Multi-Gate Experts for Multi-Task Learning at Kuaishou 背景 论文指出现在的MMOE/PLE模型存在以下几个问题: 1. 专家崩溃:专家的输出分布存在显着差异,并且一些专家使用 ReLU 的零激活率超过 90%,使得门网络很难分配公平的权重来平衡专家…

Linux 笔记

目录Linux 目录结构Linux 目录与 Windows 目录对比Windows 目录结构Linux 目录结构Linux 世界里---一切皆文件Linux 目录结构详解/bin/sbin/home/root/boot/lib/etc/usr/proc, 别动/srv, 别动/sys, 别动/tmp/dev/media/mnt/opt/usr/local/var/selinux常用快捷键案例常用命令开机…

Prometheus+Grafana 监控搭建

Prometheus+Grafana 监控搭建 Prometheus 是使用 Golang 开发的,安装和运行都非常简单,只需直接运行可执行文件即可。个人认为,只要理解了 Prometheus 的架构图,整体概念就会变得非常清晰。 Prometheus 做的挺成熟,使用非常简单,主要是想自己记录一下,方便后续记忆。 1、…

【防火墙】防火墙监控没做好,断网2小时准备提桶跑路

防火墙告警:该业务CPU负荷过多(81>= 80) ,发现吞吐量超过设备性能阈值,导致网络特别卡,客户端体现就是偶尔网络中断。 之前有篇文章是针对华三的防火墙指标数据采集做了介绍说明,可点击这里查看 网络监控:华三防火墙监控 这篇文章了解,在防火墙可观测性领域目前案例分…

nRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM),可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备,nRF21540是一种“即插即用型”的无线传输范围扩展器,可与nRF52和nRF53系列的高级多协议无线SoC搭配使用,所需的外部器件数量非常少。 nRF21540的+13dB RX增益和低…

Transformer 学习与解读

LLM学习笔记 注意力机制 sequence to sequence (seq2seq)输入N个向量,输出任意可能数量的向量(由机器决定);如果输出N个向量的任务就叫做Sequence Labeling 李沐课程讲义:https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.ht…

JDK中的可视化故障处理工具

JDK提供了几个功能集成度更高的可视化工具,我们可以使用这些可视化工具以更加便捷的方式进行进程故障诊断和调试工作。 今天就简单介绍一些JDK中的可视化故障处理工具。 JHSDB:基于服务性代理的调试工具 在说JHSDB之前,先来了解一下JCMD和JHSDB这两个集成式的多功能工具箱,…

ExKMP Z函数

讲解Z函数(ExKMP),附模板及例题更新日志 20250122:开工。思路 我们定义 \(z_i\) 表示从 \(i\) 开始的后缀与整个字符串的最长公共前缀长度。 考虑它的作用,假如我们要字符串匹配,将模式串接在前面并以特殊字符分隔,然后 \(O(n)\) 遍历原串,当 \(z_i=|T|\)(\(T\) 为模式…

【资产梳理】 攻击面资产梳理可视化工具

免责声明: ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!确定攻击面对于防御和进攻网络安全团队都至关重要。毫无疑问,可视化映射比简单的列表更有效。专家可以快速掌握…

OpenWRT24.10旁路由挂载USB移动硬盘,配置Samba4,作为NAS使用,解决中文不显示,乱码,解决断电重启后挂载失败问题

1. 为何选择OpenWRT 24.10,及如何配置旁路由,或者IPv6地址 看这篇:参OpenWRT24.10配置作为旁路由,并配置获取IPv4和IPv6地址 使用的OpenWRT固件是从这里下载的:https://openwrt.ai/ 2.挂载大容量USB移动硬盘 2.1 安装必备插件 kmod-fs-ntfs3 kmod-fs-ext4 kmod-fs-exfat…