Java | 多线程综合练习
不爱生姜不吃醋⭐️
如果本文有什么错误的话欢迎在评论区中指正
与其明天开始,不如现在行动!
文章目录
- 🌴前言
- 🌴一、卖电影票
- 1.题目
- 2.分析
- 3.代码
- 🌴二、送礼物
- 1. 题目
- 2. 分析
- 3.代码
- 🌴三.打印奇数
- 1. 题目
- 2. 分析
- 3.代码
- 🌴四.抢红包
- 1. 题目
- 2. 分析
- 3.代码
- 🌴五.抽奖
- 1. 题目
- 2. 分析
- 3.代码
- 🌴总结
🌴前言
为了能够对多线程方面有一个更加深入和全面的了解,做五道多线程相关的题目,其中1-3简单,4-5题需要在方法上有些改进。
🌴一、卖电影票
1.题目
一共1000张电影票,有两个窗口在卖,每次卖票的时间为3000毫秒,要求:用多线程模拟卖票的过程并打印剩余电影票的数量。
2.分析
题目较为简单,用Thread多线程完成。
3.代码
自己定义一个类
public class MyThread extends Thread{static int ticket = 1000;@Overridepublic void run() {while (true){synchronized (MyThread.class){if (ticket == 0){break;}try {sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}ticket--;System.out.println(getName()+"正在卖票,还剩余"+ticket+"张票!");}}}
}
启动线程
public class Demo {public static void main(String[] args) {MyThread mt1 = new MyThread();MyThread mt2 = new MyThread();mt1.setName("窗口一");mt2.setName("窗口二");mt1.start();mt2.start();}
}
🌴二、送礼物
1. 题目
有100份礼物,由两个人同时发,当剩下的礼品小于10份的时候就停止发放,利用多线程模拟该过程并将线程的名字个礼物的剩余数量打印出来。
2. 分析
思路同题目一
3.代码
自己定义一个类
public class MyThread extends Thread{static int gift = 10000;@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (gift < 10) {break;}gift--;System.out.println(getName()+"正在发礼物,还剩余"+gift+"件礼物!");}}}
}
启动线程
public class Demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("同学甲");t2.setName("同学乙");t1.start();t2.start();}
}
🌴三.打印奇数
1. 题目
同时开启两个线程,共同获取1-100之间的所有数字,要求:将输出所有的奇数。
2. 分析
思路同题目一
3.代码
自己定义一个类
public class MyThread extends Thread {static int num = 1;@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (num == 100) {break;}if (num % 2 != 0) {System.out.println("当前是线程"+getName()+"正在输出,数字:"+num);}num++;}}}
}
启动线程
public class Demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}
}
🌴四.抢红包
1. 题目
假设有100块被分成了3个红包,有五个人去抢。打印结果:
XXX抢到了XX元
XXX抢到了X元
X没抢到
2. 分析
其中,红包是共享数据,五个人是五条线程。
3.代码
自己定义一个类
public class MyThread extends Thread {static int money = 100;static int count = 3;static final int MIN = 1;@Overridepublic void run() {synchronized (MyThread.class) {int prize = 0;if (count == 0) {System.out.println(getName() + "没抢到!");} else {if (count == 1) {prize = money;} else {Random r = new Random();int bounds = money - (count - 1) * MIN + 1;prize = r.nextInt(bounds);}money -= prize;count--;System.out.println(getName() + "抢到" + prize + "元!");}}}
}
启动线程来抢红包
public class Demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();MyThread t3 = new MyThread();MyThread t4 = new MyThread();MyThread t5 = new MyThread();t1.setName("小明");t2.setName("小红");t3.setName("小李");t4.setName("小强");t5.setName("小风");t1.start();t2.start();t3.start();t4.start();t5.start();}
}
🌴五.抽奖
1. 题目
有两个抽奖箱存放了奖励金额且奖励金额不重复,分别为:2,5,10,20,50,80,100,200,500,700,800。
如果有人抽中奖,那么就把抽中的奖项显示出来,例如:
抽奖箱1产生了10元奖励
抽奖箱2产生了200元奖励
抽奖箱1产生了800元奖励
2. 分析
两个抽奖箱是两个线程,随机抽取打印
3.代码
定义一个类
public class MyThread extends Thread{ArrayList<Integer> list = new ArrayList<>();public MyThread(ArrayList<Integer> list) {this.list = list;}@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (list.size() == 0) {break;}Collections.shuffle(list);Integer prize = list.remove(0);System.out.println(getName()+"产生了"+prize+"元大奖!");try {sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}
}
启动线程
public class Demo {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,2,5,10,20,50,80,100,200,500,700,800);MyThread t1 = new MyThread(list);MyThread t2 = new MyThread(list);t1.setName("奖箱1");t2.setName("奖箱2");t1.start();t2.start();}
}
🌴总结
文章中代码的编写使用的都是Java多线程和集合方面的知识,多加练习熟能生巧。
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!
相关文章:
Java | 多线程综合练习
不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始,不如现在行动! 文章目录 🌴前言🌴一、卖电影票1.题目2.分析3.代码 🌴二、送礼物1. 题目2. 分析3.代码 🌴三.打印奇数1. 题目2.…...
Kotlin变量与控制条件的基本用法
一、变量与控制条件 1、var与val var:可修改变量 val:只读变量,只读变量并非绝对只读。 编译时常量只能在函数之外定义,因为函数内常量是在运行时赋值,编译时常量要在变量赋值前存在。并且值是无法修改的。 const…...
第18章_瑞萨MCU零基础入门系列教程之GPT
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
openssl websockets
1. HTTPS通信的C实现 - 知乎 GitHub - Bwar/Nebula: Nebula is a powerful framwork for building highly concurrent, distributed, and resilient message-driven applications for C....
Vue 组件的单元测试
1、基本的示例 单元测试是软件开发非常基础的一部分。单元测试会封闭执行最小化单元的代码,使得添加新功能和追踪问题更容易。Vue 的单文件组件使得为组件撰写隔离的单元测试这件事更加直接。它会让你更有信心地开发新特性而不破坏现有的实现,并帮助其他…...
海底两万里的思维导图,轻松了解整体的内容
《海底两万里》是一部经典的科幻小说。小说以其丰富的想象力和对海底世界的描绘而闻名于世。今天我们就用思维导图的分支介绍这个作品到底讲了什么。(思维导图示例:迅捷画板) 《海底两万里》是“凡尔纳三部曲”中的第二部(其它两部…...
ZABBIX 6.4官方安装文档
一、官网地址 Zabbix:企业级开源监控解决方案 二、下载 1.选择您Zabbix服务器的平台 2. Install and configure Zabbix for your platform a. Install Zabbix repository # rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8…...
本地MQTT服务器搭建(EMQX)
一、下载EMQX 下载地址:EMQ (emqx.com) 打开官网后,选择右边的免费试用按钮 然后单击EMQX Enterprise标签,然后选择下面的EMQX开源版,选择开源版的系统平台为Windows,单击免费下载。 在新页面下单击立即下载 二、安装…...
Docker启动pandora并指定ACCESS TOKEN
把chatGPT_ACCESS_TOKEN改成你的ACCESS_TOKEN 《chatGPT ACCESS TOKEN获取地址(需要魔法)》 docker run -d -m 512m -p 88:88 --privilegedtrue -e PANDORA_SERVER0.0.0.0:88 -e PANDORA_ACCESS_TOKENchatGPT_ACCESS_TOKEN --name pandora pengzhile/pa…...
Python + Jmeter 实现自动化性能压测
Step01: Python脚本开发 文件路径:D://wl//testproject//Fone-grpc//project1//test_client.py Python 脚本作用: 通过 grpc 调用底层 c 的接口,做数据库的数据插入与查询操作,然后将返回的结果进行拼接与输出。 2.代码里面将…...
【Linux进行时】进程状态
进程状态: ❓假设我们在上课,在B站上上课,请问我们的B站是不是一直运行呢?💡不是的! ❓假设我们同时打开了B站和PDF阅读器时,是怎么运行的呢? 💡每一个进程在CPU跑一会&a…...
HarmonyOS开发环境搭建
一 鸿蒙简介: 1.1 HarmonyOS是华为自研的一款分布式操作系统,兼容Android,但又区别Android,不仅仅定位于手机系统。更侧重于万物物联和智能终端,目前已更新到4.0版本。 1.2 HarmonyOS软件编程语言是ArkTS,…...
友思特新闻|友思特与IDS深化战略合作伙伴关系
尊敬的客户和合作伙伴, 我们非常高兴地宣布,友思特已经与国际领先的机器视觉解决方案提供商 IDS 深化了我们的合作关系。 作为 IDS 的长期合作伙伴,友思特一直致力于为国内客户提供最先进的机器视觉技术和解决方案。 自从友思特与 IDS 合作…...
ARM Linux DIY(十三)Qt5 移植
前言 板子带有屏幕,那当然要设计一下 GUI,对 Qt5 比较熟悉,那就移植它吧。 移植 Qt5 buildroot 使能 Qt5,这里我们只开启核心功能 gui module --> widgets module 编译 $ make ODIY_V3S/ qt5base编译报错:找不…...
二,手机硬件参数介绍和校验算法
系列文章目录 第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓…...
ubunutu20/18/22 编译android 5相关的问题汇总-千里马framework开源代码平板编译过程
hi,粉丝朋友们: 闲鱼50块钱淘到了一个开源平板,注意这个平板是有源码的,可以进行相关的编译修改。哈哈哈,马哥这边就体验了一下50块钱平板是否可以拿来做framework呢? 哈哈,说好就开干了&#x…...
tauri vue vite
准备 rust 根据 https://www.rust-lang.org/tools/install,安装 rust 执行 cargo --version 检查安装是否完成nodejs 安装 nodejstauri cargo install create-tauri-app --lockedcargo create-tauri-app 选择: ✔ Project name tauri-app ✔ Choose wh…...
名词解析与经验分享(前端)
目录 1.什么是sass产品 2.下面我想说说事件循环 3. cmd窗口的一些快捷键 4. 组件与插件的区别 5. vue项目嵌入app后调用app方法 6.点击编辑按钮直接回到顶部,输入框光标闪动聚焦 7.短轮询与长轮询 短轮询 长轮询 8.前端moment库 9.移动端-触底刷新实现核心…...
【前端】js下载url文件
不打开新窗口进行下载 function download(res) { var elemIF document.createElement("iframe"); elemIF.src res; elemIF.style.display "none"; document.body.appendChild(elemIF); } window.open(url, _blank); a标签 const ele …...
什么是 BSD 协议?
BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件&…...
告别死记硬背:用NIOS II软核处理器和SOPC Builder快速搭建你的第一个‘片上系统’
从零构建你的第一个片上系统:NIOS II软核处理器实战指南 当你第一次拿到FPGA开发板时,是否曾好奇过这片小小的芯片如何能运行完整的处理器系统?传统的嵌入式开发往往从现成的微控制器开始,但FPGA给了我们更底层的自由——直接在可…...
Gemma-3-12b-it企业AI助手构建:基于本地多模态能力的私有知识库问答
Gemma-3-12b-it企业AI助手构建:基于本地多模态能力的私有知识库问答 1. 引言:为什么企业需要本地多模态AI助手? 想象一下,你的团队每天都要处理大量的产品手册、设计图纸、会议纪要和客户反馈。当有人问“上周会议上提到的那个产…...
CVPR 2022顶会模型MogFace:5分钟搭建本地高精度人脸检测工具,合影人数统计一键搞定
CVPR 2022顶会模型MogFace:5分钟搭建本地高精度人脸检测工具,合影人数统计一键搞定 1. 项目概述与核心价值 人脸检测作为计算机视觉的基础任务,在安防监控、社交应用、智能摄影等领域有着广泛应用。传统人脸检测工具往往面临两个痛点&#…...
开箱即用!AI股票分析师镜像体验:安全、即时、无需外部API
开箱即用!AI股票分析师镜像体验:安全、即时、无需外部API 1. 引言:金融分析的AI新范式 在金融投资领域,及时获取专业的股票分析报告是每个投资者的核心需求。传统方式要么依赖人工分析师(成本高、响应慢)…...
如何通过文献管理工具提升科研效率?探索Zotero插件的实用价值
如何通过文献管理工具提升科研效率?探索Zotero插件的实用价值 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项…...
Python中字符串能直接转换成元组吗?
目录 一、示例演示 1.1 字符串转元组 1.2 与预期结果的对比 二、深入理解:为什么是这样的结果? 2.1 字符串是可迭代对象 2.2 不同容器转换对比 三、常见场景与解决方案 3.1 场景1:想把整个字符串作为元组的一个元素 3.2 场景2&#…...
HTML5 的离线储存怎么使用?它的工作原理是什么?
HTML5 的离线存储主要通过 Application Cache (AppCache) 和 Service Workers (配合 Cache API) 两种技术实现。 重要提示: 早期的 AppCache (manifest 属性) 虽然简单,但存在严重的缺陷(如缓存更新困难、容易陷入死循环等)&#…...
中断原子操作问题
一般的,最好不要在主循环和中断中,同时对一个值进行操作,如果主循环更改前中没有关闭中断的话。但是如果是单纯的赋值操作,比如flag 1;这种这种语句本身就是原子操作,不会被中断打断,所以没有问…...
《智能体设计模式》第六章精读 | 规划模式(Planning Pattern)——让智能体从“执行命令”变成“制定计划”的智慧体
“智能不只是做事的能力,更是知道先做什么、后做什么。” —— Antonio Gulli,《智能体设计模式》 一、回顾:从工具到计划 在第五章中,我们让AI第一次“动了起来”—— 通过工具模式(Tool Pattern)&#…...
机器学习数学基础完全指南:从线性代数到概率统计的思维导图详解
机器学习数学基础完全指南:从线性代数到概率统计的思维导图详解 【免费下载链接】machine-learning-mindmap A mindmap summarising Machine Learning concepts, from Data Analysis to Deep Learning. 项目地址: https://gitcode.com/gh_mirrors/ma/machine-lear…...
