交替输出
交替输出
题目:线程 1 输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。现在要求输出 abcabcabcabcabc
wait notify 版
public class SyncWaitNotify {private volatile int flag;private volatile int loopNumber;public SyncWaitNotify(int flag,int loopNumber){this.flag = flag;this.loopNumber = loopNumber;}public void print(int flag,int next,String str){for(int i=0;i<loopNumber;i++){synchronized (this){while (this.flag != flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(str);this.flag = next;this.notifyAll();}}}public static void main(String[] args) {SyncWaitNotify syncWaitNotify = new SyncWaitNotify(1,5);new Thread(() -> {syncWaitNotify.print(1,2,"a");}).start();new Thread(() -> {syncWaitNotify.print(2,3,"b");}).start();new Thread(() -> {syncWaitNotify.print(3,1,"c");}).start();}
}
Lock 条件变量版
public class AwaitSignal extends ReentrantLock {private volatile int loopNumber;public AwaitSignal(int loopNumber) {this.loopNumber = loopNumber;}public void print(Condition condition,Condition next,String str){for(int i=0;i<loopNumber;i++){this.lock();try {try {condition.await();System.out.print(str);next.signal();} catch (InterruptedException e) {e.printStackTrace();}} finally {this.unlock();}}}public void start(Condition condition){this.lock();try {condition.signal();} finally {this.unlock();}}public static void main(String[] args) {AwaitSignal awaitSignal = new AwaitSignal(5);Condition aWait = awaitSignal.newCondition();Condition bWait = awaitSignal.newCondition();Condition cWait = awaitSignal.newCondition();new Thread(() -> {awaitSignal.print(aWait,bWait,"a");}).start();new Thread(() -> {awaitSignal.print(bWait,cWait,"b");}).start();new Thread(() -> {awaitSignal.print(cWait,aWait,"c");}).start();awaitSignal.start(aWait);}
}
Park Unpark 版
public class SyncPark {private int loopNumber;public Thread[] threads;public SyncPark(int loopNumber){this.loopNumber = loopNumber;}public void print(int next,String str){for(int i=0;i<loopNumber;i++){LockSupport.park();System.out.print(str);LockSupport.unpark(threads[next]);}}public void start(Thread thread){LockSupport.unpark(thread);}public static void main(String[] args) {SyncPark syncPark = new SyncPark(5);Thread t1 = new Thread(() -> {syncPark.print(1, "a");}, "t1");Thread t2 = new Thread(() -> {syncPark.print(2, "b");}, "t2");Thread t3 = new Thread(() -> {syncPark.print(0, "c");}, "t3");syncPark.threads = new Thread[]{t1,t2,t3};t1.start();t2.start();t3.start();syncPark.start(t1);}
}
相关文章:
交替输出
交替输出 题目:线程 1 输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。现在要求输出 abcabcabcabcabc wait notify 版 public class SyncWaitNotify {private volatile int flag;private volatile int loopNumber;public SyncWaitNo…...
JS(三)——更改html内数据
获取 DOM 元素,然后修改其属性或内容。使用 getElementById 方法获取特定 ID 的元素: <p id"myParagraph">这是初始的文本</p> const paragraph document.getElementById(myParagraph); paragraph.innerHTML 这是修改后的文本…...
CSS小玩意儿:文字适配背景
一,效果 二,代码 1,搭个框架 添加一张背景图片,在图片中显示一行文字。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…...
C++:平衡二叉搜索树之红黑树
一、红黑树的概念 红黑树, 和AVL都是二叉搜索树, 红黑树通过在每个节点上增加一个储存位表示节点的颜色, 可以是RED或者BLACK, 通过任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树能够确保没有一条路径会比…...
CentOS 7 系统优化
CentOS 7 系统优化 1、配置YUM源 阿里云的YUM源配置: CentOS 7使用以下命令: sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoCentOS 8使用以下命令: sudo wget -O /etc/yum.repos.d/CentOS…...
扫雷游戏——附源代码
扫雷游戏的源代码比较简单,不设计比较复杂的代码,主要是多个函数的组合,每个函数执行自己的功能,最终支持游戏的完成。 1.菜单 我们需要一个提醒信息来让用户进行选择。 void menu() {printf("***********************\n&…...
Vue3列表(List)
效果如下图:在线预览 APIs List 参数说明类型默认值bordered是否展示边框booleanfalsevertical是否使用竖直样式booleanfalsesplit是否展示分割线booleantruesize列表尺寸‘small’ | ‘middle’ | ‘large’‘middle’loading是否加载中booleanfalsehoverable是否…...
HarmonyOS NEXT - Navigation组件封装BaseNavigation
demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新,请前往github查看最新代码 在demo中这些组件和工具类都通过module实现了,具体可以参考HarmonyOS NEXT - 通过 module 模块化引用公共组件和utils 官方介绍 组件导航 (Navigation)(推…...
浅看MySQL数据库
有这么一句话:“一个不会数据库的程序员不是合格的程序员”。有点夸张,但是确是如此。透彻学习数据库是要学习好多知识,需要学的东西也是偏难的。我们今天来看数据库MySQL的一些简单基础东西,跟着小编一起来看一下吧。 什么是数据…...
Pytorch常用训练套路框架(CPU)
文章目录 1. 数据准备示例:加载 CIFAR-10 数据集 2. 模型定义示例:定义一个简单的卷积神经网络 3. 损失函数和优化器示例:定义损失函数和优化器 4. 训练循环示例:训练循环 5. 评估和测试示例:评估模型 6. 保存和加载模…...
C++ | Leetcode C++题解之第338题比特位计数
题目: 题解: class Solution { public:vector<int> countBits(int n) {vector<int> bits(n 1);for (int i 1; i < n; i) {bits[i] bits[i & (i - 1)] 1;}return bits;} };...
智慧校园云平台电子班牌系统源码,智慧教育一体化云解决方案
智慧校园云平台电子班牌系统,利用先进的云计算技术,将教育信息化资源和教学管理系统进行有效整合,实现生态基础数据共享、应用生态统一管理,为智慧教育建设的统一性,稳定性,可扩展性,互通性提供…...
数据库系统 第17节 数据仓库 案例赏析
下面我将通过几个具体的案例来说明数据仓库如何在不同的行业中发挥作用,并解决实际业务问题。 案例 1: 零售业 背景: 一家大型零售商希望改进其库存管理和市场营销策略,以提高销售额和顾客满意度。 解决方案: 数据仓库: 构建一个数据仓库࿰…...
硬件面试经典 100 题(71~90 题)
71、请问下图电路的作用是什么? 该电路实现 IIC 信号的电平转换(3.3V 和 5V 电平转换),并且是双向通信的。 上下两路是一样的,只分析 SDA 一路: 1) 从左到右通信(SDA2 为输入状态&…...
【git】代理相关
问题: 开启了翻墙代理工具,拉取代码时报错:fatal: 无法访问 xxxx : Failed to connect to github.com port 443: 连接超时 解决: 0,取消代理仍然无法拉取 1,查看控制面板-网络与Internet-代理ÿ…...
golang gin框架中创建自定义中间件的2种方式总结 - func(*gin.Context)方式和闭包函数方式定义gin中间件
在gin框架中,我们可以通过2种方式创建自定义中间件: 1. 直接定义一个类型为 func(*gin.Context)的函数或者方法 这种方式是我们常用的方式,也就是定义一个参数为*gin.Context的函数或者方法。定义的方法就是创建一个 参数类型为 gin.Handler…...
Linux高级编程 8.13 文件IO
一、文件IO 操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用(unistd.h) 其中有个 文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。 这是一个基于Linux内核的没有缓存的IO机制 文件IO特性&…...
【k8s】ubuntu18.04 containerd 手动从1.7.15 换为1.7.20
ubutnu18.04之前手动安装了1.7.15现在下载1.7.20containerd-1.7.20-linux-amd64.tar.gz root@k8s-worker-i58265u:/home/zhangbin# root@k8s-worker-i58265u:/home/zhangbin# https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-am…...
常用浮动方式
目录 一、标准流 二、float浮动 三、 flex浮动 3.1flex组成 3.2 主轴对齐方式 3.3侧轴对齐方式 3.4修改主轴方向 3.5弹性盒子换行 3.6行对齐方式 一、标准流 标签在网页中的默认排布规则 例如: 块元素独占一行、行内元素可以一行显示多个 二、float浮动 让块…...
设计模式反模式:UML常见误用案例分析
文章目录 设计模式反模式:UML常见误用案例分析1. 反模式概述2. 反模式的 UML 图示误用2.1 God Object 反模式2.2 Spaghetti Code 反模式2.3 Golden Hammer 反模式2.4 Poltergeist 反模式 3. 总结 设计模式反模式:UML常见误用案例分析 在软件工程领域&am…...
别再死记硬背GPIO寄存器了!用STM32 HAL库和CubeMX快速实现LED流水灯与按键控制
解放双手:用STM32CubeMX和HAL库玩转GPIO控制 在嵌入式开发的世界里,GPIO控制就像学习编程时的"Hello World"一样基础而重要。但有多少开发者还在为记忆繁琐的寄存器配置而头疼?当项目周期压缩到以天为单位计算时,我们是…...
PlayAI多语种翻译能力边界实测(含方言识别、专业术语库热加载、混合语种断句逻辑),你敢信它已通过ISO/IEC 24615标准认证?
更多请点击: https://intelliparadigm.com 第一章:PlayAI多语种同步翻译功能详解 PlayAI 的多语种同步翻译功能基于端到端神经机器翻译(NMT)架构与实时语音流处理引擎深度融合,支持中、英、日、韩、法、西、德、俄等 …...
将随身WiFi变身微型服务器:基于高通410芯片刷入Debian实战
1. 为什么选择高通410随身WiFi改服务器? 去年我在整理抽屉时翻出三个闲置的随身WiFi设备,突然想到:这些搭载高通410芯片的小玩意,能不能变成微型Linux服务器?经过两周的折腾,不仅成功刷入Debian系统&#x…...
MQTT QoS压力测试:RyanMqtt消息可靠性深度剖析与实战避坑
1. 项目概述:为什么我们要死磕MQTT的QoS?最近在折腾一个物联网项目,后台服务用的是RyanMqtt。项目上线前,团队里有个兄弟随口问了句:“咱们这消息到底靠不靠谱?别设备上报的数据丢了,或者指令发…...
Parabolic视频下载神器:一站式跨平台解决方案的终极指南
Parabolic视频下载神器:一站式跨平台解决方案的终极指南 【免费下载链接】Parabolic Download web video and audio 项目地址: https://gitcode.com/GitHub_Trending/pa/Parabolic Parabolic是一款基于yt-dlp引擎的专业级视频下载工具,为技术爱好…...
你还在手动写Type Hints和Docstring?Gemini实时生成合规PEP 484/561注释(附GitHub Star超5k的私有化部署模板)
更多请点击: https://intelliparadigm.com 第一章:你还在手动写Type Hints和Docstring?Gemini实时生成合规PEP 484/561注释(附GitHub Star超5k的私有化部署模板) 现代Python工程已将类型安全与可维护性提升至核心地位…...
手一滑,我把整个店都报上了活动
做Temu最怕什么?不是没单,不是被压价,是手滑。 去年有一次,我打算给店里十几个新款报个日常活动冲冲量。打开Temu商家后台,店铺营销,营销活动,找到合适的活动场次点了“去报名”。报名页里商品…...
Linux入门篇之RK3588基于Buildroot系统下安装交叉编译器
一、交叉编译器 交叉编译器是一种能够在一种计算机平台上生成另一种平台可执行代码的编译器。例如,在x86架构的PC上编译出运行于ARM架构嵌入式设备的程序。与本地编译器不同,交叉编译器的编译环境和运行环境是分离的。 二、为什么需要交叉编译器&#…...
为什么你的“Château Margaux”印相总像海报?——深度拆解顶级酒庄视觉DNA:橡木桶纹理采样率、标签压纹深度与AI光影映射函数
更多请点击: https://intelliparadigm.com 第一章:为什么你的“Chteau Margaux”印相总像海报?——视觉失真现象的本体论诊断 高保真图像输出失败,常被归咎于打印机或纸张——但真正症结往往潜伏在色彩管理的底层逻辑中。当一张承…...
掌握Flash逆向工程:JPEXS免费反编译工具完全指南
掌握Flash逆向工程:JPEXS免费反编译工具完全指南 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在Flash技术逐渐淡出历史舞台的今天,无数经典的Flash动画、游戏…...
