当前位置: 首页 > 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()方法里面就可以写去这个水井里面去取水

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

相关文章:

Java(多线程)

取水: 主部分: package a0506.Test3;import java.util.Random;public class Test3 {public static void main(String[] args) {Well2 well2new Well2(10);WellThread Zsnew WellThread("------张三------",well2,new Random().nextInt(5));W…...

程序员必备的7大神器,效率飞起!

我们都知道程序员在工作时,会经常遇到任务繁重的情况,为了提高效率,程序员们也会借助一些软件,那么哪些软件可以帮助程序员们提高工作效率呢? 整理不易,关注一波!! 1. Xftp 7 Xft…...

揭秘文件加密利器:24年度最值得信赖的5大加密软件评测

数据安全与隐私保护已成为我们每个人都必须面对的重要问题。 文件加密软件作为保障数据安全的关键工具,其重要性不言而喻。 在众多的加密软件中,哪些软件能够在保障数据安全的同时,又具备良好的易用性和稳定性呢? 本文将为您揭秘…...

【仪酷LabVIEW AI工具包案例】使用LabVIEW AI工具包+YOLOv5结合Dobot机械臂实现智能垃圾分类

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 🎄所属专栏:『仪酷LabVIEW AI工具包案例』 📑上期文章:『【YOLOv9】实战二:手把手教你使用TensorRT实现YOLOv…...

鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证

文章目录 系列文章背景认证考试题库参考注意:题库会不定时的进行具备调整甚至整体轮换,此为2024.5月版本注意:题库中题目的选项每次都会随机顺序,请参考内容判断题单选题多选题系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环…...

基于Linux中的 进程相关知识 综合讲解

目录 一、进程的基本概念 二、pid,ppid,fork函数 三、进程的状态讲解 四、进程的优先级 五、完结撒❀ 一、进程的基本概念 概念: ● 课本概念:程序的一个执行实例,正在执行的程序等 ● 内核观点:担当…...

前端高频面试题 5.08

事件委托 事件委托是前端开发中常用的一种优化性能和代码可维护性的方法,它基于DOM的事件冒泡机制。当一个元素触发事件时,这个事件会按照从顶层到底层的顺序传播,直到最底层的元素(通常是文档的根节点)。事件委托利用…...

python 的继承、封装和多态

1. 继承(Inheritance) 继承是面向对象编程中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,同时也可以扩展或修改父类的行为。 常用…...

数智结合,智慧合同让法务管理发挥内在价值

在当今这个信息化、数字化飞速发展的时代,数据已成为企业重要的战略资源。法务管理作为企业内部控制和风险防范的重要环节,其重要性不言而喻。然而,传统的法务管理模式往往存在效率低下、信息孤岛、反应迟缓等问题。在这样的背景下&#xff0…...

Ubuntu 安装docker

1: 卸载旧版本 如果你曾经安装过旧版本的 Docker,首先需要卸载它们: sudo apt-get remove docker docker-engine docker.io containerd runc2: 安装依赖工具 安装一些必要的工具,以便后续的安装过程能够顺利进行: sudo apt-ge…...

【北京迅为】《iTOP-3588开发板快速烧写手册》-第8章 TF启动

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...

Helm 模板流程控制

Helm 的模板语言提供了多种控制结构,以允许模板作者根据条件逻辑生成模板内容。以下是 Helm 模板控制结构的核心内容总结: 控制结构 Helm 模板支持以下控制结构: if/else:用于创建条件语句,根据给定的条件包含或排除…...

Kansformer?变形金刚来自过去的新敌人

​1.前言 多层感知器(MLPs),也被称为全连接前馈神经网络,是当今深度学习模型的基础组成部分。 MLPs在机器学习中扮演着至关重要的角色,因为它们是用于近似非线性函数的默认模型,这得益于通用近似定理所保证的表达能力。然而,MLPs真的是我们能构建的最佳非线性回归器吗?尽管ML…...

今晚 19:00 | 从这两个问题入手,带你了解数据要素相关税务问题

五一假期已经结束,返工后当然是继续劳动啦~数据要素系列直播《星光对话》第三期也将在今晚19:00,继续跟大家见面。 本期直播,依然由 星光数智咨询总监 刘靖 主讲,带来:《数据要素相关税务问题解读》。 主要围绕两个问题…...

《QT实用小工具·五十一》带动画的 CheckBox

1、概述 源码放在文章末尾 该项目实现了带动画效果的多选框&#xff0c;鼠标放在上面或者选中都会呈现炫酷的动画效果&#xff0c;demo演示如下&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LINEARCHECKBOX_H #define LINEARCHECKBOX_H#include <QCheckBox> …...

PDT(police digital trunking )警用数字集群射频指标及测试方法

天线端口----测试传导 机箱端口----测试辐射 基本概念 传导测试方法 VBW3RBW 仪器设置 辐射测试方法...

《尿不湿级》STM32 F103C8T6最小系统板搭建(五)BOOT

一、BOOT是什么&#xff1f; 大多数初学者第一次接触BOOT总是对这个词感到不解&#xff0c;从哪冒出一个奇奇怪怪的东西还要接跳线帽&#xff0c;为什么要配置它才能进行串口程序的下载&#xff1f;为什么不正确配置会导致单片机无法正常启动…… boot&#xff0c;及物动词&…...

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…...

linux高性能服务器-线程池实现

文章目录 定义应用场景任务类型线程数量数据结构设计&#xff1a;任务设计&#xff1a;队列设计&#xff1a;线程池设计 接口设计 定义 线程池属于生产消费模型&#xff0c;管理维持固定数量线程的池式结构&#xff0c;避免线程频繁的创建和销毁 应用场景 当一类任务耗时&am…...

算法训练营第56天|LeetCode 583.两个字符串的删除操作 72.编辑距离

LeetCode 583.两个字符串的删除操作 题目链接&#xff1a; LeetCode 583.两个字符串的删除操作 代码&#xff1a; class Solution { public:int minDistance(string word1, string word2) {int size_1 word1.size();int size_2 word2.size();vector<vector<int>…...

threestudio-3dgs实战:5分钟生成可编辑的3D汉堡模型(避坑指南)

threestudio-3dgs实战&#xff1a;5分钟生成可编辑的3D汉堡模型&#xff08;避坑指南&#xff09; 当我在深夜调试完最后一个参数&#xff0c;看到屏幕上那个纹理清晰、结构完整的3D汉堡模型时&#xff0c;突然意识到——3D高斯泼溅技术正在彻底改变数字内容创作的方式。不同于…...

【CP AUTOSAR】Icu驱动模块:从原理到实战的配置与优化指南

1. Icu驱动模块在AUTOSAR架构中的核心作用 第一次接触AUTOSAR的Icu模块时&#xff0c;我完全被它复杂的配置项搞懵了。直到在S32K3项目上实际调试电机转速测量功能&#xff0c;才真正理解这个模块的价值。简单来说&#xff0c;Icu就像汽车电子系统的"脉搏检测仪"&…...

基于MATLAB的隔离型DC DC变换器系统设计:技术指标明确、包含设计报告与仿真程序的全过程解析

基于MATLAB的单端反激——隔离型DC/DC变换器系统设计 本设计包括设计报告&#xff0c;仿真程序。技术指标 输入电压、输出电压、输出功率、纹波系数、开关频率见下图凌晨三点盯着示波器的我&#xff0c;突然被显示器上的锯齿状波形逗笑了——这哪儿是DC/DC变换器啊&#xff0c;…...

OpCore-Simplify:黑苹果配置的终极简化指南,零基础也能轻松上手

OpCore-Simplify&#xff1a;黑苹果配置的终极简化指南&#xff0c;零基础也能轻松上手 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑…...

【服务器】上传百度网盘数据至服务器

目录方法一&#xff1a;使用开源命令行工具 BaiduPCS-Go (最推荐)实例&#xff1a;下载网盘数据实例&#xff1a;上传服务器数据至百度网盘单个文件测试上传批量裁剪文件参考方法一&#xff1a;使用开源命令行工具 BaiduPCS-Go (最推荐) 这是目前在 Linux/Windows 服务器上最流…...

【shell编程】深入解析Permission denied:7种实战解决方案与场景应用

1. 为什么会出现Permission denied错误&#xff1f; 第一次在终端里看到"Permission denied"这个红色警告时&#xff0c;我正试图运行一个刚写好的shell脚本。当时完全懵了&#xff0c;明明文件就在那里&#xff0c;为什么说没权限&#xff1f;后来才发现&#xff0c…...

从拦截到免疫:PKCE如何重塑OAuth授权码流程的安全防线

1. 授权码拦截攻击&#xff1a;OAuth的致命弱点 想象一下这样的场景&#xff1a;你在手机上打开一个看起来很正常的天气应用&#xff0c;点击"使用微信登录"按钮后&#xff0c;系统跳转到微信授权页面。你输入账号密码完成授权&#xff0c;突然发现自己的微信聊天记录…...

SpringBoot项目如何动态加载用户上传的Jar包?两种热部署方案对比

SpringBoot动态加载用户Jar包实战&#xff1a;两种热部署方案深度解析 在当今快速迭代的软件开发环境中&#xff0c;插件化架构正成为提升系统扩展性的关键策略。作为Java生态中最流行的框架之一&#xff0c;SpringBoot项目常面临需要动态加载用户自定义Jar包的需求场景。本文将…...

避坑指南:在Windows/Linux双环境下部署ThinkPHP6+MQTT服务的那些事儿

跨平台实战&#xff1a;ThinkPHP6与MQTT服务在Windows/Linux混合环境中的部署精要 当开发者需要在Windows本地开发环境与Linux生产服务器之间部署ThinkPHP6与MQTT服务时&#xff0c;往往会遇到各种意想不到的"坑"。本文将深入探讨这一混合环境下的关键技术难点&#…...

如何高效解决Cursor试用限制?完整实用的解决方案指南

如何高效解决Cursor试用限制&#xff1f;完整实用的解决方案指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We h…...