当前位置: 首页 > 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.cnnetsun.cn/news/185847.html

相关文章:

  • XHS-Downloader小红书数据采集终极指南:5分钟快速上手教程
  • Vue3-Element-Admin终极解决方案:企业级后台管理系统的完整框架
  • 罗技鼠标宏完整配置教程:快速掌握绝地求生压枪技巧
  • Zotero-SciPDF终极指南:一键获取学术文献PDF的完美解决方案
  • Zotero-SciPDF终极指南:一键获取学术文献PDF的完整解决方案
  • VMware macOS解锁工具终极指南:轻松打造跨平台开发环境
  • 基于Vivado2025的Verilog综合行为全面讲解
  • Hitboxer SOCD清理器:终极游戏按键冲突解决方案
  • 视频PPT智能提取:零基础快速上手完整教程
  • 图解说明常见工控设备USB串口驱动安装流程
  • VMware Unlocker工具使用指南:在Windows和Linux系统上运行macOS虚拟机
  • TranslucentTB色彩选择器深度解析:解锁Windows任务栏个性化新境界
  • iOS自定义终极指南:无需越狱打造专属iPhone体验
  • MAA智能助手:明日方舟游戏自动化管理全解析
  • TranslucentTB 完整使用教程:让 Windows 任务栏瞬间变透明的终极方案
  • Vue3-Element-Admin:5分钟搭建企业级后台系统的终极解决方案
  • Zotero插件终极指南:3步实现PDF自动下载
  • Soundflower终极指南:macOS虚拟音频设备的完整配置与实战应用
  • Jasminum插件生态整合:构建智能科研文献管理平台
  • Vue3 Element Admin:企业级后台管理系统的技术革新与实战指南
  • Zotero文献去重插件完整指南:智能合并重复条目
  • 2025必存!小白秒变创作大神!0成本解锁AI写歌自由,4款顶级免费工具
  • 3分钟学会Zotero自动下载PDF:SciPDF插件完整教程
  • BabelDOC实战指南:智能PDF翻译工具的高效应用技巧
  • 嘉立创PCB布线项目应用:电源模块在EasyEDA中的布局布线
  • 如何轻松解决微信网页版访问限制?wechat-need-web插件全解析
  • 超详细版CubeMX安装与串口下载驱动配置流程
  • 小红书下载器终极指南:3分钟掌握免费无水印下载技巧
  • 如何在macOS上完美运行ComfyUI-Manager?终极兼容性实战指南
  • XHS-Downloader终极指南:轻松下载小红书无水印内容