当前位置: 首页 > news >正文

Java线程间通信

       我们这里使用两个线程分别充当生产者和消费者,对资源res进行共享,并通过res进行通信,其中用到了同步锁、wait、notify、sleep等方法。

解法1:见下面代码。

//资源,我们这里表示煤,分精煤和烟煤 class Resource { String name; int weight; // 表示煤是否已经拉来,true表示煤已拉来 boolean flag = false; // 拉煤的总车数 int numCars = 0; } // Input代表拉煤的小卡车 class Input implements Runnable { Resource res; public Input(Resource res) { this.res = res; } @Override public void run() { int x = 0; while (true) { synchronized (res) { if (res.numCars > 99) { break; } if (!res.flag) { try { Thread.sleep(10); } catch (Exception e) { } if (x == 0) { res.name = "精煤"; // 表示一次拉6吨精煤 res.weight = 6; } else { res.name = "烟煤"; // 表示一次拉10吨烟煤 res.weight = 10; } x = (x + 1) % 2; res.flag = true; res.numCars++; System.out.println(Thread.currentThread().getName() + "拉来一车重" + res.weight + "吨的" + res.name + ";这是第" + res.numCars + "车煤。"); // 拉来煤之后就等待消耗,直到锅炉消耗完,通知小卡车去拉煤 try { res.wait();// 会释放锁,而sleep方法不释放锁 } catch (InterruptedException e) { e.printStackTrace(); } } } } } } // Output代表锅炉,用来消耗煤 class Output implements Runnable { Resource res; public Output(Resource res) { this.res = res; } @Override public void run() { while (true) { synchronized (res) { if (res.flag) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "烧了一车重" + res.weight + "吨的" + res.name + ";这是第" + res.numCars + "车煤。"); res.name = null; res.weight = 0; res.flag = false; // 煤消耗完了,通知小卡车拉煤去 res.notify(); } if (res.numCars > 99) { break; } } } } } public class ThreadCommunication { public static void main(String[] args) { Resource resource = new Resource(); Input input = new Input(resource); Output output = new Output(resource); //线程bob充当小卡车 Thread bob = new Thread(input, "Bob"); //线程mike充当锅炉 Thread mike = new Thread(output, "Mike"); bob.start(); mike.start(); } }

解法2:上面的代码进行优化,进行了顺序调整,增加了合理化的判断。

//资源,我们这里表示煤,分精煤和烟煤 class Resource { String name; int weight; // 表示煤是否已经拉来,true表示煤已拉来 boolean flag = false; // 拉煤的总车数 int numCars = 0; } // Input代表拉煤的小卡车 class Input implements Runnable { Resource res; public Input(Resource res) { this.res = res; } @Override public void run() { int x = 0; while (true) { synchronized (res) { if (res.numCars > 99) { break; } if (res.flag) {// 有煤就睡觉休息,等待唤醒 try { res.wait();// 会释放锁,而sleep方法不释放锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thre
http://www.jsqmd.com/news/124498/

相关文章:

  • 2025年终户外健身器材/儿童游乐设施厂家TOP5权威推荐(附权威评分) - 深度智识库
  • MAA自动公招系统:解放双手的明日方舟智能辅助利器
  • pjsip多平台驱动兼容设计:跨架构集成的全面讲解
  • 【vuejs】vm.$set() 的原理解析和方法以及应用场景
  • 【新技术】用Nano Banana Pro做PPT还能二次编辑的AI工具有哪些?
  • ComfyUI工作流模型管理终极指南:三步快速修复路径配置问题
  • Windows Cleaner终极指南:免费快速解决C盘爆满的完整方案
  • MAA明日方舟智能管家:3大核心功能深度解析与实战配置指南
  • SOCD Cleaner终极指南:告别游戏操作冲突,提升竞技水平
  • PMO实战:AI研发效能度量(DORASPACE)路线图
  • Python命令行工具Click
  • MAA自动公招系统:让明日方舟招募更智能高效
  • XHS-Downloader核心技术解析:突破小红书API安全机制的技术实现
  • 如何在VMware中完美运行macOS:解锁工具Unlocker 3.0终极指南
  • 小红书无水印下载终极指南:5分钟学会批量保存图文视频
  • 千万不能选错!这5款实验室操作台让你事半功倍
  • Java线程的两个重要方法
  • 小米运动自动刷步工具:智能步数同步解决方案
  • 自媒体人的福音!灵方矩阵AI视频混剪+多平台分发,效率翻倍!
  • Jasminum插件生态整合:构建智能科研文献管理平台
  • ArduPilot航拍安全返航机制:全面讲解
  • Windows清理大师:一键释放C盘空间的终极方案
  • 如何快速配置Zotero-SciPDF插件:5步实现学术文献一键下载
  • C语言字符串函数介绍以及模拟实现
  • Windows平台Arduino IDE驱动安装避坑指南
  • 【2024最新】xhs数据采集工具的完整使用指南
  • Cowabunga Lite终极指南:iOS个性化定制完全手册
  • HarmonyOS 4G AT指令测试器
  • FGO-Automata:从手指酸痛到游戏自由的智能蜕变
  • 实验室改造?这几个方案超赞!