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

Java(多线程)

取水:

主部分:

package a0506.Test3;import java.util.Random;public class Test3 {public static void main(String[] args) {Well2 well2=new Well2(10);WellThread Zs=new WellThread("------张三------",well2,new Random().nextInt(5));WellThread Ls=new WellThread("------李四------",well2,new Random().nextInt(6));WellThread Ww=new WellThread("------王五------",well2,new Random().nextInt(8));WellThread Tt=new WellThread("------桃桃------",well2,new Random().nextInt(3));Zs.start();Ls.start();Ww.start();Tt.start();try {Ls.join();//当前线程main要等待Ls线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)Zs.join();//当前线程main要等待Zs线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)Ww.join();//当前线程main要等待Ww线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)Tt.join();//当前线程main要等待Tt线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)} catch (InterruptedException e) {e.printStackTrace();}System.out.println("剩余水量: "+well2.getWaterSize());}
}

水井:

package a0506.Test3;import java.util.concurrent.locks.ReentrantLock;public class Well2 {private int waterSize;private final ReentrantLock lock=new ReentrantLock();public Well2(int waterSize) {this.waterSize = waterSize;}public void fetchWater(int number){lock.lock();try {if (number > this.waterSize) {System.out.println("剩余水量: " + this.waterSize + ",不能供应: " + number + Thread.currentThread().getName() + "没有水喝");} else {System.out.println(Thread.currentThread().getName() + "取走水量:" + number);this.waterSize -= number;System.out.println("剩余水量: " + this.waterSize);}}finally{lock.unlock();}}public int getWaterSize(){return this.waterSize;}
}

取水线程:

package a0506.Test3;public class WellThread extends Thread{private Well2 well;private int number;public WellThread(String name, Well2 well, int number) {super(name);this.well = well;this.number = number;}public void setNumber(int number) {this.number = number;}public int getSize(){return this.well.getWaterSize();}@Overridepublic void run() {this.well.fetchWater(number);}
}

 理解:

感觉之前写的代码并没有很好的体现面向对象这个问题;

先分析一下这个代码:

分了三个类,水井类有水量,还有一个方法(传入一个参数要取多少水)用来反应取水的情况(实际来看水井确实只需要知道一个水量就可以了,可以反应剩下多少水等等)取水的线程类有线程名字(谁取水)取水量(取多少水),水井(在哪个水井取水)然后run()方法里面就可以写去这个水井里面去取水

感觉这个思路就很清晰,感觉自己之前写的代码一点逻辑都没有糊上去的。以后多加改正

http://www.lryc.cn/news/343452.html

相关文章:

  • 程序员必备的7大神器,效率飞起!
  • 揭秘文件加密利器:24年度最值得信赖的5大加密软件评测
  • 【仪酷LabVIEW AI工具包案例】使用LabVIEW AI工具包+YOLOv5结合Dobot机械臂实现智能垃圾分类
  • 鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证
  • 基于Linux中的 进程相关知识 综合讲解
  • 前端高频面试题 5.08
  • python 的继承、封装和多态
  • 数智结合,智慧合同让法务管理发挥内在价值
  • Ubuntu 安装docker
  • 【北京迅为】《iTOP-3588开发板快速烧写手册》-第8章 TF启动
  • Helm 模板流程控制
  • Kansformer?变形金刚来自过去的新敌人
  • 今晚 19:00 | 从这两个问题入手,带你了解数据要素相关税务问题
  • 《QT实用小工具·五十一》带动画的 CheckBox
  • PDT(police digital trunking )警用数字集群射频指标及测试方法
  • 《尿不湿级》STM32 F103C8T6最小系统板搭建(五)BOOT
  • Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)
  • linux高性能服务器-线程池实现
  • 算法训练营第56天|LeetCode 583.两个字符串的删除操作 72.编辑距离
  • 首页最新 多IP浏览器防关联:如何配置多个独立且稳定的IP地址?
  • 电脑连接公司打印机教程
  • JavaScript 中的 Promise.all
  • 机器视觉_联合编程(二)
  • AUTOCRAWLER : A Progressive Understanding Web Agent for WebCrawler Generation
  • php使用服务器端和客户端加密狗环境部署及使用记录(服务器端windows环境下部署、linux环境宝塔面板部署、客户端部署加密狗)
  • Android selinux权限
  • Flutter笔记:Widgets Easier组件库(9)使用弹窗
  • 【解决Android Studio】cmake报错找不到vulkan包
  • 手动卸载32 位office
  • python selenium 滑动后获取动态追加的元素