设计一个高效的Java多线程应用程序及案例
《剑来》
勇敢追梦:“如果真的有那么喜欢苏姑娘,既然这辈子到最后也没能说出口喜欢她,没关系,以后数十年百余年,哪怕找遍人间,你都要去再见她一次,大声告诉她,自己喜欢她。”
正视困难,迎难而上:“君子不妄动,动必有道。君子不徒语,语必有理。君子不苟求,求必有义。君子不虚行,行必有正。”
目录
1. 理解并发基础
2. 最小化共享状态
3. 使用高级并发API
4. 避免死锁
5. 使用原子操作
6. 优化锁策略
7. 利用线程池
8. 监控与调优
9. 测试并发代码
实际应用案例
1. Web服务器请求处理
2. 文件批处理任务
3. 生产者-消费者模式的消息队列
4. 实时日志分析平台
设计一个高效的Java多线程应用程序涉及到多个方面,从理解并发基础到选择合适的工具和技术,再到优化性能和确保系统的可靠性。以下是基于现有资料的一些建议和最佳实践。
1. 理解并发基础
首先,深入理解并发编程的基本概念是至关重要的,包括但不限于线程、进程、同步、互斥、死锁等。此外,了解Java内存模型(JMM)以及Happens-Before原则对于编写正确的多线程代码非常重要。这有助于开发者避免常见的并发问题,如数据竞争和可见性问题。
2. 最小化共享状态
尽量减少线程间共享的数据量,当确实需要共享时,优先考虑不可变对象或使用局部变量。这样不仅可以降低对同步措施的需求,还可以减少复杂性和潜在的错误风险。例如,在可能的情况下,将共享资源转换为每个线程私有的副本,或者使用ThreadLocal来为每个线程提供独立的实例。
3. 使用高级并发API
充分利用Java提供的java.util.concurrent
包中的类,如ExecutorService
、CyclicBarrier
、CountDownLatch
和Semaphore
等,这些工具可以简化并发控制并提高代码质量。特别是ExecutorService
可以帮助我们更有效地管理线程池,从而避免频繁创建和销毁线程所带来的开销。
4. 避免死锁
采取措施防止死锁的发生,比如按照固定的顺序获取锁,并确保所有线程都遵循相同的顺序;设置锁超时以避免无限期等待;甚至可以在运行时检测并打破死锁。通过合理的锁策略设计,可以显著减少死锁的可能性。
5. 使用原子操作
对于简单的操作,如计数器递增,可以利用java.util.concurrent.atomic
包下的原子类(如AtomicInteger
或AtomicLong
)。这些类提供了无锁算法保证的操作原子性,通常比传统的锁机制更加高效。
6. 优化锁策略
当必须使用锁时,应选择最适合应用场景的锁类型。例如,可以通过缩短锁持有时间、采用细粒度锁、或者在读多写少的情况下使用读写锁(如ReentrantReadWriteLock
),以减少不同部分之间的争用。
7. 利用线程池
正如前面提到的,使用线程池可以重用线程,减少创建和销毁的成本,同时还能更好地管理和控制资源。根据任务的特点配置适当的核心线程数和最大线程数,比如对于CPU密集型任务建议设置为核心线程数等于逻辑处理器数量加一,而对于I/O密集型任务则可以设置为两倍于逻辑处理器数量。
8. 监控与调优
构建多线程系统后,应该持续监控其性能,并根据观察到的问题进行调整。可以使用性能分析工具和日志记录来识别瓶颈和异常行为。例如,定期检查线程池的工作负载、队列长度、已完成任务的数量等指标,以便及时作出响应。
9. 测试并发代码
并发代码的测试往往更具挑战性,因为问题可能是非确定性的。因此,应该使用专门的并发测试工具和技术,如压力测试、多线程单元测试和静态代码分析,帮助发现潜在的并发问题。
实际应用案例
高效的Java多线程应用程序案例能够帮助开发者更好地理解如何在实际项目中应用并发编程的最佳实践。以下是几个具体的案例,它们展示了不同的多线程应用场景和技术实现方式。
1. Web服务器请求处理
背景: 在Web服务器环境中,通常需要同时处理来自多个客户端的HTTP请求。为了提高效率和服务质量,可以采用多线程技术来并行处理这些请求。
解决方案: 使用ExecutorService
创建一个线程池来管理请求处理器线程。每当接收到新的HTTP请求时,就将其提交给线程池中的一个工作线程去执行。通过这种方式,不仅能够充分利用CPU资源,还可以避免因频繁创建和销毁线程而带来的性能损耗。此外,还可以根据服务器负载动态调整线程池大小,确保系统稳定运行的同时尽可能地提升吞吐量。
import java.util.concurrent.*;public class WebServer {private final ExecutorService executor = Executors.newCachedThreadPool();public void handleRequest(Runnable requestHandler) {executor.execute(requestHandler);}// ... other methods ... }
2. 文件批处理任务
背景: 对于需要批量处理大量文件的任务,如日志分析、图片压缩等,使用单线程逐个处理可能会非常耗时。因此,可以通过引入多线程来加速这一过程。
解决方案: 设计一个多线程框架,其中每个线程负责处理一部分文件列表。这里可以利用ForkJoinPool
或CompletableFuture
来简化异步任务的管理和协调。同时,考虑到磁盘I/O操作往往是阻塞式的,应当合理设置线程数以平衡效率与资源消耗之间的关系。例如,可以根据可用核心数设定最大并发度,并结合BlockingQueue
作为待处理文件的任务队列,防止过多任务堆积导致内存溢出。
import java.util.concurrent.*;public class FileProcessor {private final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());public void processFiles(List<String> filePaths) throws InterruptedException {CountDownLatch latch = new CountDownLatch(filePaths.size());for (String path : filePaths) {executor.submit(() -> {try {// Process file at 'path'} finally {latch.countDown();}});}latch.await(); // Wait until all files have been processedexecutor.shutdown();} }
3. 生产者-消费者模式的消息队列
背景: 生产者-消费者问题是经典的多线程同步问题之一,它描述了两个或更多进程之间通过共享缓冲区交换信息的过程。在这种情况下,生产者生成数据项放入缓冲区,而消费者则从缓冲区取出并消费这些数据项。
解决方案: 利用BlockingQueue
接口提供的几种实现(如LinkedBlockingQueue
、ArrayBlockingQueue
)构建安全的消息队列。这样既保证了生产者和消费者之间的解耦,又实现了高效的线程间通信。为了进一步优化性能,可以在生产者端实施批量插入策略,减少锁竞争;而在消费者端则可以采用批量读取的方式,一次性获取多个元素进行处理。
import java.util.concurrent.*;public class ProducerConsumerExample {private final BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);public static void main(String[] args) throws InterruptedException {ProducerConsumerExample example = new ProducerConsumerExample();Thread producer = new Thread(example::produce);Thread consumer = new Thread(example::consume);producer.start();consumer.start();producer.join();consumer.join();}private void produce() throws InterruptedException {int value = 0;while (true) {synchronized (this) {if (queue.size() == 10) wait(); // Buffer full, wait for spacequeue.put(value++);notifyAll();}}}private void consume() throws InterruptedException {while (true) {synchronized (this) {if (queue.isEmpty()) wait(); // Buffer empty, wait for itemsInteger value = queue.take();System.out.println("Consumed: " + value);notifyAll();}}} }
4. 实时日志分析平台
背景: 日志分析平台需要接收来自不同来源的日志流,并对其进行解析、过滤、聚合等操作。考虑到日志输入量可能非常大,因此需要精心设计内部架构,包括但不限于预处理阶段的负载均衡、中间层的数据缓存、最终存储前的数据压缩等环节。
解决方案: 构建一个多阶段流水线式架构,每个阶段由一组专门的工作线程组成。日志接收器监听指定端口接收TCP/UDP格式的日志文本;解码器将原始字节流转换成可读的对象形式;过滤器根据配置规则丢弃不关心的日志条目;聚合器合并相似的日志事件,生成更有价值的信息摘要;输出处理器将处理后的结果保存至文件系统或发送给下游系统。整个过程中,各个组件之间通过消息队列传递数据,确保高效且可靠地完成各项任务。
import java.util.concurrent.*;public class LogAnalyzer {private final ExecutorService receiverPool = Executors.newFixedThreadPool(4);private final ExecutorService decoderPool = Executors.newFixedThreadPool(8);private final ExecutorService filterPool = Executors.newFixedThreadPool(4);private final ExecutorService aggregatorPool = Executors.newFixedThreadPool(2);private final ExecutorService outputPool = Executors.newFixedThreadPool(1);private final BlockingQueue<byte[]> rawLogs = new LinkedBlockingQueue<>();private final BlockingQueue<LogEntry> decodedLogs = new LinkedBlockingQueue<>();private final BlockingQueue<LogEntry> filteredLogs = new LinkedBlockingQueue<>();public void startProcessing() {receiverPool.submit(this::receiveLogs);decoderPool.submit(this::decodeLogs);filterPool.submit(this::filterLogs);aggregatorPool.submit(this::aggregateLogs);outputPool.submit(this::outputLogs);}private void receiveLogs() { /* Implementation */ }private void decodeLogs() { /* Implementation */ }private void filterLogs() { /* Implementation */ }private void aggregateLogs() { /* Implementation */ }private void outputLogs() { /* Implementation */ } }
综上所述,以上四个案例分别代表了不同类型的应用场景下的多线程编程实践。通过学习和模仿这些例子,开发者可以获得宝贵的经验和技术积累,从而更加自信地面对复杂的并发挑战。同时,这也为后续深入研究提供了良好的起点。
相关文章:
设计一个高效的Java多线程应用程序及案例
《剑来》 勇敢追梦:“如果真的有那么喜欢苏姑娘,既然这辈子到最后也没能说出口喜欢她,没关系,以后数十年百余年,哪怕找遍人间,你都要去再见她一次,大声告诉她,自己喜欢她。” 正视困…...
基于最新的Apache StreamPark搭建指南
一、StreamPark 的介绍 官方文档:Apache StreamPark (incubating) | Apache StreamPark (incubating) 中文文档:Apache StreamPark (incubating) | Apache StreamPark (incubating)Github地址:https://github.com/apache/incubator-streampark Apache StreamPark™ 是一个…...
迎接全新的 Kotlin 支持 – K2 模式:基本信息
K2 模式有什么作用? K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现,它可以提高 IDE 的稳定性,同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别? K2 编译器负责编译 Kotlin 语言 2.0 或…...
阿里云元宇宙
在数字经济时代,技术的迅猛发展带来了前所未有的机遇与挑战,元宇宙正逐步成为全球科技与商业创新的热点。作为中国云计算和人工智能领域的领导者,阿里云通过其强大的技术能力,推出了全面的阿里云元宇宙解决方案,为全球…...
题目 1688: 数据结构-字符串插入
第一种方式字符串 #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(){string s1,s2;int n;cin>>s1>>s2>>n;s1.insert(n-1,s2);cout<<s1<<endl;return 0; } 第二种方式字符数组 …...
MetaGPT中的教程助手:TutorialAssistant
1. 提示词 COMMON_PROMPT """ You are now a seasoned technical professional in the field of the internet. We need you to write a technical tutorial with the topic "{topic}". """DIRECTORY_PROMPT (COMMON_PROMPT "…...
如何将Python程序打包发布,实现一键安装
哈喽,大家好,我是木头左! 编写完Python脚本后,如何将其高效地发布并安装到其他计算机上,。本文将详细介绍如何将Python程序打包发布,实现一键安装,让程序的分发与部署变得轻松便捷。 一、准备工作 1. 编写和测试程序 在开始打包之前,首先要确保你的Python程序已经编…...
Java 接口
1. 接口概述 (1) Java提供了一个关键字 interface,用这个关键字可以定义接口; (2)格式: public interface 接口名{ //成员变量(常量) //成员方法(抽象方法) } public interface A {//成员变量(接口默认为常量-public static final)String NA…...
RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用
无人机与低空经济的关系密切,并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元,其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展,公共安防关乎每一个市民的生命财产安全。在…...
【Flutter_Web】Flutter编译Web第一篇(插件篇):Flutter_web实现上传TOS上传资源,编写web插件
前言 由于Flutter在双端的开发体验几乎接近的情况下,尝试将Flutter代码转Web端进行部署和发布,在其中遇到的所有问题,我都会通过这种方式分享出来。那么第一个要解决的就是上传资源到TOS上,在双端中都是通过插件的方式在各端通过…...
SpringBoot 项目使用 EasyExcel 插件构建 Excel 表格格式(行高、列宽和字体等)工具类
本文主要讲了如何使用 EasyExcel 插件,在导出 Excel 时,设置行高,列宽,表头格式,内容字体大小等工具类。 1、代码使用的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyex…...
数据优化带来的问题
原因大概可以猜到 等待进一步深究(必须一个是浮点型) double x 1 / 2;double x2 static_cast<double> (1 / 2);double x3 (double)1 / (double)2;double x4 (double)1 / 2;double x5 1 / (double)2;double nTotalDataCount 78182;double n…...
2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长
2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长 《春烂漫:新平摄影作品选》作者新平,2019.12.25年读完的小书,当时就觉得挺不错,今…...
RabbitMQ个人理解与基本使用
目录 一. 作用: 二. RabbitMQ的5中队列模式: 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化: 消息过期时间 ACK应答 四. 同步接收和异步接收: 应用场景 五. 基本使用 ÿ…...
每天40分玩转Django:Django视图和URL
Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…...
ModbusTcp获取数据
ModbusTcp获取数据 记录一个用 pymodbus 库来获取数据的代码。 注意: 1.读取寄存器地址是16进制的。2.大小端转换通过代码知道原理。读取数据时,切记频率别太高,否则会出现连接被关闭问题。 from pymodbus.client.sync import ModbusTcpCli…...
汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌
汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌 数据集分割 训练组82% 6994图片 有效集12% 999图片 测试集6% 500图片 预处理 自动…...
YOLOv5+pyqt5+摄像头在特定条件下进行目标检测并采集原始数据
项目介绍 项目地址 GitHub - biabu0/Yolov5_D435i: 通过YOLOV5与pyqt5实现一个使用D435i深度摄像头采集特定需求与场景下的深度数据的小程序 通过YOLOV5对指定的区域进行检测,当检测到目标进入特定区域时,开始保存数据,摄像头采用D435i深度…...
代码随想录-算法训练营-番外(图论02:岛屿数量,岛屿的最大面积)
day02 图论part02 今日任务:岛屿数量,岛屿的最大面积 都是一个模子套出来的 https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html#思路往日任务: day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercar…...
C# 23种设计模式(3)工厂(SimpleFactory)模式
一、工厂模式介绍 工厂模式(Factory Pattern)是一种在软件开发中常用的创建型设计模式。它的主要目的是将对象的创建逻辑与使用逻辑分离,使得增加新的对象类型时不需要修改使用对象的代码。这样做提高了系统的可扩展性和可维护性。 工厂模式…...
安卓主板_MTK联发科android主板方案
在当前智能设备的发展中,安卓主板的配置灵活性和性能优化显得尤为重要。安卓主板的联发科方案,在芯片上,搭载联发科MTK6761、MT8766、MT6765、MT6762、MT8768、MT8390、MTK8370以及MT8788等型号,均基于64位的四核或八核架构设计。…...
中企出海 - 平行账 - Parallel Ledger
以中国企业出海美国,为同时满足中国和美国的会计核算要求,请给出SAP 平行账的实施方案及国家科目表(alternative account)实施海外国家的注意事项 中国企业在美国开展业务需同时满足中国和美国的会计准则,这通常包括《中国企业会计准则》&am…...
Pyside6 --Qt设计师--简单了解各个控件的作用之:Item Views
目录 一、List View二、Tree View三、Table View四、Column View 一、List View 学习方法和Buttons一样,大家自己在qt设计师上面在属性编辑区进行相应的学习! 我就先紧着qt设计师的页面进行讲解,部分内容查自AI。 后面有什么好用的控件或者…...
智能家居WTR096-16S录放音芯片方案,实现语音播报提示及录音留言功能
前言: 在当今社会的高速运转之下,夜幕低垂之时,许多辛勤工作的父母尚未归家。对于肩负家庭责任的他们而言,确保孩童按时用餐与居家安全成为心头大事。此时,家居留言录音提示功能应运而生,恰似家中的一位无形…...
算法2(蓝桥杯19)-合并两个有序链表
问题:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路: 创建一个虚拟节点,循环比较l1、l2链表各节点的大小,将较小的节点追加到虚拟节点后,返回新链表 1、…...
OpenAI 正式赋予 ChatGPT 通过视频实时与用户互动的能力
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【Email】基于SpringBoot3.4.x集成发送邮件功能
【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中…...
debian12学习笔记
前置条件 基于debian12官网的qcow2格式文件进行操作 安装ssh 登录虚拟机后安装ssh服务端 apt install openssh-server配置国内源 新增/etc/apt/sources.list.d/tsinghua.list 使用清华大学的源 https://www.cnblogs.com/shanhubei/p/18104430 deb https://mirrors.tuna.t…...
(补)算法刷题Day16:BM39 序列化二叉树
题目链接 描述 思路: 自行序列化和反序列化。元素用逗号分隔。 序列化: 使用队列层序遍历。遍历每一层节点,并访问其左右孩子,如果是空则序列化成#,如果是数字,则序列化成str。 反序列化: 使…...
科研绘图系列:R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot boxplot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3系统信息参考介绍 R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot & boxplot) 加载R包 library(magrittr) library(dplyr) library(ve…...
docker 安装mysql 5.7 详细保姆级教程
1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了,可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 ,演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …...
PostgreSql
PostgreSql 1.物化视图1.1 创建物化视图1.2 查询物化视图1.3 使用物化视图1.4 刷新物化视图1.5 删除物化视图 1.物化视图 物化视图是一种存储查询结果的数据库对象。与普通视图不同,物化视图将查询结果实际存储在磁盘上,而不是在每次查询时动态计算结果…...
优化移动端H5:常见问题与解决方案
移动端H5开发中的“坑”与解决方案 本文介绍了开发中遇到的几个关于移动端H5开发中的小问题,以及解决的方法。 一、iOS滑动不流畅问题 在iOS设备上,H5页面的滑动效果有时会出现不流畅的情况,特别是在页面高度超过一屏时。这通常是由于iOS的…...
AWS Glue实现RDS到RDS的数据同步
使用 在AWS上,AWS Glue 是一个完全托管的ETL(Extract, Transform, Load)服务,可以轻松地将数据从一个源系统提取出来,转换数据格式,然后将其加载到目标系统。本文将详细介绍如何使用AWS Glue将数据从一个RDS(关系型数据库服务)实例同步到另一个RDS实例,而无需手动编写…...
【Redis】Redis缓存击穿
1. 概述 缓存击穿:缓存击穿问题也叫热点key问题,一个高并发的key或重建缓存耗时长(复杂)的key失效了,此时大量的请求给数据库造成巨大的压力。如下图,线程1还在构建缓存时,线程2,3&…...
QILSTE H8-316QFO高亮橙光LED灯珠 发光二极管LED
在当今电子技术领域,H8-316QFO型号的LED以其卓越的性能和可靠性 脱颖而出。本文将深入探讨这款LED的关键参数,以期为工程师和技术人员提供详尽的技术参考。 首先,H8-316QFO的物理特性不容忽视。其外观尺寸为3.2x1.5x0.8mm,小巧的…...
pytest入门三:setup、teardown
https://zhuanlan.zhihu.com/p/623447031 function对应类外的函数,每个函数调用一次 import pytest def setup_module():print(开始 module)def teardown_module():print(结束 module)def setup_function():print(开始 function)def teardown_function():print(结…...
MySQL有哪些高可用方案?
大家好,我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…...
IT 行业的就业情况
当前,IT 行业的就业情况呈现出以下特点: 1. 需求持续增长:随着数字化转型的加速,各个行业对信息技术的依赖程度不断提高,推动了对 IT 人才的持续需求。特别是在云计算、大数据、人工智能、物联网等新兴领域ÿ…...
[SWPU 2019]漂流记的马里奥
[SWPU 2019]漂流记的马里奥 解压安装包,里面有一个exe程序,运行后得到一个1.txt的文件 打开1.txt文件发现里面有给flag.txt 在这里的话可以用windows中的命令来打开falg.txt文件 notepad是一个用于打开Windows系统自带的记事本程序的命令 输入 notepa…...
如何在Android设备上复制整个目录到另一个位置?
在Android设备上复制整个目录到另一个位置,通常需要通过adb工具(Android Debug Bridge)来进行操作,因为它提供了文件系统级别的访问权限。以下是步骤: 打开命令行终端:首先,你需要连接你的Andro…...
人工智能在医疗健康领域的革命:从早期诊断到个性化治疗
引言:人工智能如何改变医疗健康 人工智能(AI)正在以惊人的速度渗透到医疗健康领域,从自动化诊断到个性化治疗,AI技术为提高医疗服务效率、降低成本和提升治疗效果提供了革命性的解决方案。本文将探讨人工智能在医疗健…...
MPQ3364调试异常异常问题
问题 MPQ3364_FAULT脚不报异常? 分析思路 首先排除硬件环境 1)把BL PWM接到3.3V(相当于PWM100%),FAULT脚和MCU断开,拔掉屏幕,FAULT 可以报异常 2.保持相同的输入环境,测试差异: 软…...
Flutter中GetBuilder 和 GetX 的区别
在 GetX 框架中,GetBuilder 和 GetX 都是用来构建响应式 UI 的,但它们在使用方式和适用场景上有一些不同。 GetBuilder 作用: 用于监听控制器中的特定变量变化并重新构建部分 UI。 特点: 只有当 update() 方法被调用时,才会触发 UI 的重建。…...
vue2+element-ui实现多行行内表格编辑
效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…...
Vue3+TypeScript+AntVX6实现Web组态(从技术层面与实现层面进行分析)内含实际案例教学
摘要 用Vue3+TypeScript+AntVX6实现Web组态(从技术层面与实现层面进行分析),包含画布创建、节点设计、拖拽实现(实际案例)、节点连线、交互功能,后续文章持续更新。 注:本文章可以根据目录进行导航 文档支持 AntVX6使用文档 https://x6.antv.antgroup.com/tutorial…...
【卷积神经网络】LeNet实践
模型建立 数据初始化根据模型搭建前向传播打印模型结构 前向传播数据初始化 def __init__(self):super(LeNet, self).__init__()# 第一层卷积层:# 输入:灰度图像 (1通道,大小 28x28)# 输出:6个特征图 (大小 28x28, 通过padding2保…...
FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…...
Tongweb8命令行使用收集(by lqw)
文章目录 声明对应版本修改thanos用户密码部署应用到默认实例节点相关操作新增节点(一般一个服务器ip只能装一个节点)启动节点(需确认节点没有运行)停止节点删除节点节点新增应用节点查看应用节点启动应用节点停止应用节点卸载应用(谨慎操作,卸载后应用就没有了,建议备份后…...
基于STM32的火灾烟雾报警器设计开题报告
开题报告 题目:基于STM32的火灾烟雾报警器Proteus仿真设计 一、研究背景与意义 随着现代城市化进程的加快,火灾安全问题日益凸显,火灾的早期预警对于减少人员伤亡和财产损失至关重要。传统的火灾报警系统往往依赖于烟雾或温度的单一检测&a…...