news 2026/4/23 9:49:37

Java线程间通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:49:42

如何用Jasminum实现Zotero中文文献的智能管理

还在为手动整理中文文献而烦恼吗?Zotero中文文献管理一直是个痛点,特别是面对大量中文期刊和PDF文档时。Jasminum插件通过自动化文献整理技术,让这一切变得轻松简单。 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. …

作者头像 李华
网站建设 2026/4/23 11:15:39

零基础掌握Proteus 8 Professional电路绘图技巧

从零开始玩转Proteus:手把手教你画出第一个能仿真的电路你有没有过这样的经历?想做个智能小灯,代码写好了,却因为接错一个电阻烧了单片机;或者调试DS18B20温度传感器时,程序明明没错,可就是读不…

作者头像 李华
网站建设 2026/4/23 13:02:35

小红书数据采集实战:从入门到精通的Python解决方案

小红书数据采集实战:从入门到精通的Python解决方案 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在数字化营销时代,小红书作为内容电商的重要阵地&…

作者头像 李华
网站建设 2026/4/23 13:02:36

NBTExplorer终极指南:3步掌握我的世界数据编辑

NBTExplorer终极指南:3步掌握我的世界数据编辑 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾经好奇为什么别人的《我的世界》存档总是充满惊…

作者头像 李华
网站建设 2026/4/12 18:24:52

BGE-Large-zh-v1.5中文嵌入模型实战指南:从零到精通

还在为中文文本检索的准确性发愁吗?🤔 想知道如何让AI真正理解你的中文文档内容?今天我们就来深入探索BGE-Large-zh-v1.5这个中文嵌入模型的强大功能,让你在中文NLP领域游刃有余! 【免费下载链接】bge-large-zh-v1.5 …

作者头像 李华
网站建设 2026/4/23 11:20:52

Zotero中文文献管理难题的终极解决方案

还在为手动整理海量中文文献而头疼吗?每次添加新论文都要重复输入作者、期刊、年份这些基本信息?Jasminum插件正是为你量身打造的文献管理神器! 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件…

作者头像 李华