[javaSE] 多线程通信(等待-唤醒机制)
2023-02-18 15:47:15 时间
两个线程操作同一个资源,比如,输入和输出,操作同一个对象,此时两个线程会争夺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(); } }
相关文章
- centos国内源总结
- 图解高效神经网络结构搜索(ENAS)
- 浅谈气象服务需求
- 重复建设
- Room Arranger for mac(简单易用的室内设计软件)v9.7.2中文激活版
- 给客户的定心丸——产品检验报告
- 从“互联网人”的视角看气象服务
- 全国各区域“两个细则”对风光功率预测考核要求的比较
- “盘古”再现,“江湖”不宁
- 气象部门有哪些是公益二类事业单位
- 驻场气象局工作 领悟客户服务思维
- 遇到“搭便车”问题怎么办?
- ToG气象产品开发的项目管理
- 图像识别的可视化解释史
- 无监督胶囊网络
- 小游戏不是“大厂”特权
- 一文读懂递归算法!
- 如何定制化Spring Boot Starter,这次我终于学会了
- 入门 | 一文简述深度学习优化方法——梯度下降
- 不懂Nacos没关系,可以看看它是怎么运用代理模式的