[javaSE] 多线程通信(等待-唤醒机制)
两个线程操作同一个资源,比如,输入和输出,操作同一个对象,此时两个线程会争夺cpu的执行权,随机的进行切换。我们想实现先输入再输出,顺序的执行
目标对象定义一个标记字段,进行判断,wait()和notify()方法
wait()方法,线程会处于等待状态,等待的线程位于内存中的线程池中
notify()方法,唤醒线程池中的线程
notifyAll()方法,唤醒全部线程
上面的方法,需要写在同步里面,并且需要标识锁
这些操作线程的方法定义在Object对象中,因为这些方法,要通过同一个锁对象来调用
/** * 资源 * * @author taoshihan * */ class People { String name; String sex; Boolean myLock = false; } /** * 输入 * * @author taoshihan * */ class PeopleJoin implements Runnable { private People resource; public PeopleJoin(People resource) { this.resource = resource; } @Override public void run() { // 切换 boolean flag = true; while (true) { synchronized (resource) { if (resource.myLock) { try { resource.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if (flag) { resource.name = "taoshihan"; resource.sex = "nan"; } else { resource.name = "陶士涵"; resource.sex = "男"; } flag = !flag; resource.myLock=true; resource.notify(); } } } } /** * 输出 * * @author taoshihan * */ class PeopleOut implements Runnable { private People resource; public PeopleOut(People resource) { this.resource = resource; } @Override public void run() { while (true) { synchronized (resource) { if(!resource.myLock){ try { resource.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(resource.name + "=====" + resource.sex); resource.myLock=false; resource.notify(); } } } } public class ThreadDemo { /** * @param args */ public static void main(String[] args) { People resource = new People(); PeopleJoin input = new PeopleJoin(resource); PeopleOut output = new PeopleOut(resource); Thread t1 = new Thread(input); Thread t2 = new Thread(output); t1.start(); t2.start(); } }
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具