JUC入门(三)
7、Callable
1、可以有返回值
2、可以抛出异常
3、方法不同 run()/call()
代码测试
老版本的应用
package com.yw.callable;public class Old {public static void main(String[] args) {new Thread(new MyThread()).start();}
}class MyThread implements Runnable{@Overridepublic void run(){}
}
Callable
package com.yw.callable;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class NewThread {public static void main(String[] args) throws ExecutionException, InterruptedException {MyNewThread myNewThread = new MyNewThread();FutureTask futureTask = new FutureTask(myNewThread);//适配类new Thread(futureTask,"A").start();//结果会被缓存提高效率new Thread(futureTask,"B").start();String result = (String) futureTask.get();//获取Callable的返回结果,这个方法会产生阻塞//或者使用异步来处理System.out.println(result);}
}class MyNewThread implements Callable<String> {@Overridepublic String call() throws Exception {System.out.println("call");return "你好,Callable";}
}
细节:
- 结果会被缓存
- 结果可能需要等待,会产生阻塞
8、常用的辅助类
CountDownLatch
可以简单将其理解为减法计数器
一般用于必须要执行某个任务过后才继续执行时使用
代码展示:
package com.yw.utlis;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {//必须要执行的任务执行完成后才能继续执行CountDownLatch countDownLatch = new CountDownLatch(6);//总数是6for (int i = 1; i <=6; i++){final int tmp = i;new Thread(()->{System.out.println(Thread.currentThread().getName() + "出门咯");countDownLatch.countDown();//数量-1},String.valueOf(tmp)).start();}countDownLatch.await();//等待计数器归0才继续执行后面的操作System.out.println("关门");}
}
原理:
核心数据结构
CountDownLatch
的核心是一个计数器(count
),它在创建时被初始化为一个正整数。这个计数器的值表示需要等待的线程数量。
- 当一个线程调用
countDown()
方法时,计数器的值会减 1。 - 当计数器的值减到 0 时,表示所有需要等待的线程都已经完成了任务,此时所有因等待计数器归零而被阻塞的线程会被唤醒并继续执行
主要方法
CountDownLatch(int count)
:构造方法,初始化计数器的值。void countDown()
:将计数器的值减 1。如果计数器的值减到 0,所有等待的线程会被唤醒。void await()
:当前线程等待,直到计数器的值减到 0。如果计数器的值已经是 0,则当前线程直接继续执行。boolean await(long timeout, TimeUnit unit)
:当前线程等待,直到计数器的值减到 0 或者超时。如果超时,当前线程会返回,而不会被阻塞。
底层实现
CountDownLatch
的底层实现基于 AQS(AbstractQueuedSynchronizer,抽象队列同步器)。AQS 是 Java 并发包的核心框架,它提供了一种基于队列的锁机制。
countDown()
方法:调用 AQS 的releaseShared()
方法,尝试将计数器的值减 1。如果计数器的值减到 0,会唤醒所有等待的线程。await()
方法:调用 AQS 的acquireSharedInterruptibly()
方法,当前线程会进入等待状态,直到计数器的值减到 0 或者被中断。
工作流程
- 初始化:创建
CountDownLatch
对象时,指定计数器的初始值。 - 线程等待:一个或多个线程调用
await()
方法,这些线程会被阻塞,等待计数器的值减到 0。 - 线程完成任务:其他线程完成任务后,调用
countDown()
方法,计数器的值减 1。 - 计数器归零:当计数器的值减到 0 时,所有等待的线程被唤醒,继续执行后续操作。
CyclicBarrier
可以简单将其理解为加法计数器
代码演示:
package com.yw.utlis;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo {public static void main(String[] args) throws BrokenBarrierException, InterruptedException {CyclicBarrier cyclicBarrier = new CyclicBarrier(9,()->{System.out.println("上课");});//这个班级有6个学生,都到齐了才开始上课for (int i = 1;i <= 6;i++){final int tmp = i;new Thread(()->{try {cyclicBarrier.await();//表示当前线程达到屏障,触发+1} catch (InterruptedException e) {throw new RuntimeException(e);} catch (BrokenBarrierException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + "到教室了");},String.valueOf(tmp)).start();}}
}
原理:
CyclicBarrier
是 Java 并发包(java.util.concurrent
)中提供的一个同步工具类,用于协调多个线程之间的同步操作。它可以让多个线程在某个点上相互等待,直到所有线程都到达这个点后,再一起继续执行。与 CountDownLatch
不同,CyclicBarrier
是可重用的,即在一次同步操作完成后,它可以被重置并再次使用。
核心概念
CyclicBarrier
的核心是一个循环屏障,它通过一个计数器来跟踪到达屏障的线程数量。当所有线程都到达屏障时,屏障会被释放,所有线程可以继续执行。
- 参与者数量(
parties
):在创建CyclicBarrier
时,需要指定一个整数parties
,表示需要参与同步的线程数量。 - 计数器:用于记录到达屏障的线程数量。每当一个线程到达屏障时,计数器加 1。
- 重置机制:当所有线程都到达屏障后,计数器会被重置为 0,屏障可以再次被使用。
主要方法
CyclicBarrier(int parties)
:构造方法,指定需要参与同步的线程数量。CyclicBarrier(int parties, Runnable barrierAction)
:构造方法,除了指定线程数量外,还可以指定一个在所有线程到达屏障后执行的回调任务(barrierAction
)。void await()
:当前线程到达屏障,等待其他线程也到达屏障。如果所有线程都到达屏障,则释放所有线程。boolean await(long timeout, TimeUnit unit)
:当前线程到达屏障,等待其他线程到达屏障或超时。如果超时,则当前线程会抛出TimeoutException
。int getNumberWaiting()
:获取当前正在等待的线程数量。int getParties()
:获取参与同步的线程数量。
底层实现
CyclicBarrier
的底层实现也是基于 AQS(AbstractQueuedSynchronizer)。它通过共享锁的方式实现线程的同步。
await()
方法:调用 AQS 的acquireSharedInterruptibly()
方法,当前线程进入等待状态。当所有线程都到达屏障时,AQS 会释放所有等待的线程。barrierAction
回调任务:在所有线程到达屏障后,会由最后一个到达屏障的线程执行barrierAction
任务。
工作流程
- 初始化:创建
CyclicBarrier
对象时,指定参与同步的线程数量(parties
)。 - 线程到达屏障:每个线程在执行到某个点时调用
await()
方法,表示到达屏障。 - 等待同步:线程调用
await()
后会被阻塞,直到所有线程都到达屏障。 - 释放线程:当所有线程都到达屏障后,所有等待的线程被释放,继续执行后续操作。
- 重置屏障:释放线程后,屏障会被重置,可以再次使用。
Semaphore
本质就是信号量操作
代码演示
package com.yw.utlis;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class SemaphoreDemo {public static void main(String[] args) {//线程数量:这里举例比喻为3个车位Semaphore semaphore = new Semaphore(3);for (int i = 1;i <= 6;i++){final int tmp = i;new Thread(()->{try {semaphore.acquire();//得到空车位System.out.println(Thread.currentThread().getName() + "抢到车位了");TimeUnit.SECONDS.sleep(3);//假设停车三秒钟System.out.println(Thread.currentThread().getName() + "离开车位了");} catch (InterruptedException e) {throw new RuntimeException(e);} finally {semaphore.release();//释放空车位}},String.valueOf(tmp)).start();}}
}
原理
核心概念
Semaphore
的核心是一个许可计数器,它表示可用的许可数量。线程在访问资源之前需要获取许可,访问完成后释放许可。
- 许可数量(
permits
):在创建Semaphore
时,需要指定初始的许可数量。 - 获取许可(
acquire()
):线程调用acquire()
方法时,会尝试获取一个许可。如果没有可用的许可,线程会被阻塞。 - 释放许可(
release()
):线程调用release()
方法时,会释放一个许可,使其他线程可以获取许可并继续执行。
主要方法
Semaphore(int permits)
:构造方法,指定初始的许可数量。void acquire()
:当前线程获取一个许可。如果没有可用的许可,线程会被阻塞。boolean tryAcquire()
:当前线程尝试获取一个许可。如果当前有可用的许可,直接获取并返回true
;否则返回false
。boolean tryAcquire(long timeout, TimeUnit unit)
:当前线程尝试获取一个许可,直到超时。如果在超时时间内获取到许可,返回true
;否则返回false
。void release()
:当前线程释放一个许可。int availablePermits()
:返回当前可用的许可数量。
底层实现
Semaphore
的底层实现也是基于 AQS(AbstractQueuedSynchronizer)。它通过共享锁的方式实现线程的同步。
acquire()
方法:调用 AQS 的acquireSharedInterruptibly()
方法,尝试获取一个许可。如果没有可用的许可,线程会被阻塞。release()
方法:调用 AQS 的releaseShared()
方法,释放一个许可,使其他线程可以获取许可并继续执行。
工作流程
- 初始化:创建
Semaphore
对象时,指定初始的许可数量。 - 线程获取许可:线程在访问资源之前调用
acquire()
方法,尝试获取一个许可。 - 线程阻塞:如果没有可用的许可,线程会被阻塞,直到有许可被释放。
- 线程释放许可:线程访问资源完成后调用
release()
方法,释放一个许可。 - 重复使用:
Semaphore
是可重用的,许可数量会动态变化。
相关文章:
JUC入门(三)
7、Callable 1、可以有返回值 2、可以抛出异常 3、方法不同 run()/call() 代码测试 老版本的应用 package com.yw.callable;public class Old {public static void main(String[] args) {new Thread(new MyThread()).start();} }class MyThread implements Runnable{Overri…...
RV1126多线程获取SMARTP的GOP模式数据和普通GOP模式数据
通过代码的方式同时获取SMARTP模式的VENC码流数据和普通GOP模式的VENC码流数据,并进行对比画质。 一.RV1126 VI采集摄像头数据并同时编码SMARTP模式和普通GOP模式的编码码流流程 RV1126利用多线程同时获取普通GOP的VENC码流数据和SMARTP的码流数据一般如上图&#…...
MySQL事务、视图、索引、备份和恢复
1. 事务 如果不使用事务,那么如果出现了张三账户汇款成功-500元,但是李四那边的服务器出现了故障没有接收到500元,那么就会出现张三账户里有500元但是李四那边的账户还是1元的情况,转账的500元被吞了。 创建事务 2. 视图 创建视图…...
yolov8训练模型优化模型【误检】
针对 YOLOv8 模型在电动车人脸检测中出现误检行人人脸的问题,结合最新研究与实践经验,以下提供多维度优化方案及具体实施步骤: 一、数据集优化 数据清洗与标注增强 剔除干扰样本:确保训练集中所有标注仅包含骑行状态的人脸&#x…...
初识MySQL · 索引
目录 前言: 重温磁盘 认识索引 为什么这么做,怎么做 重谈page 聚簇索引VS非聚簇索引 回表查询 索引分类 前言: 前文我们主要是介绍了MySQL的一些基本操作,增删查改一类的操作都介绍了,并且因为大多数情况下&am…...
Kubernetes in action-配置和应用升级
Kubernetes的配置和应用升级 1、配置1.1 configMap1.2 secret1.3 Downward API1.4 Kubernetes API 2、服务升级2.1 升级方式2.1.1 先删除所有的旧版pod,使用新版本pod替换2.1.2 先创建新版pod,再删除旧版本pod2.1.3 滚动优化 2.2 使用deployment声明式升…...
十三、面向对象底层逻辑-Dubbo序列化Serialization接口
一、引言:分布式通信的数据桥梁 在分布式服务调用中,参数的跨网络传输需要将对象转化为二进制流,这一过程直接影响系统的性能、兼容性与安全性。Dubbo通过Serialization接口构建了可扩展的序列化体系,支持多种序列化协议的无缝切…...
5.19 打卡
DAY 30 模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入...
MathType公式如何按照(1)(2)…编号
在word中使用mathtype插入公式,发现插入的公式编号默认为(1.1),(1.2)…,但论文中常用的公式编号是(1)(2)…,分享一下如何实现(1.1)→(1)。 ①word菜单找到“MathType”,点击“插入编号”-“格式化”。 ②取消勾选“章编号”和“节…...
解决即使安装了pageoffice网页还是无法跳转、点击按钮没有反应等问题
出现的现象: 安装了pageoffice网页还是无法跳转、点击按钮没有反应 网页提示的错误: 点击按钮之前右键检查网页发现的错误: 点击无效按钮之后右键检查出现的错误: 原因: 鉴于安全性的考虑,新版浏览器不支…...
正点原子STM32新建工程
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。 MDK5 由两个部分组成: MDK Core 和 Software Packs。 MDK Core 又分成四个部分: uVision IDE with Editor(编辑器), ARMC/C Compiler(编译…...
计算机网络 第三章:运输层(一)
运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务。通常特别关注因特网协议,即 TCP 和 UDP 运输层协议。 讨论运输层和网络层的关析,为研究运输层第一个关键功能ÿ…...
机器学习(14)——模型调参
文章目录 一、动态调参方法论1. 调参策略选择2. 千万数据优化原则 二、模型调参策略对比1. LightGBM调参路线2. XGBoost调参路线3. 随机森林调参策略 三、代码实现示例通用数据准备(适用于所有模型)1. LightGBM调参示例2. XGBoost调参示例3. 随机森林调参…...
基于PetaLinux的Zynq PS应用自启动全攻略
一、嵌入式Linux启动管理的艺术 在工业机器人、智能摄像头、边缘计算网关等场景中,开机自启动管理是系统可靠性的第一道关卡。本文将深入讲解Zynq PS端在PetaLinux环境下实现: Systemd服务深度定制启动时序精准控制启动速度优化技巧动态服务管理创新方案二、环境搭建与工程配…...
贪心算法:多处最优服务次序、删数问题
多处最优服务次序问题 问题描述:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1≤i≤n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 算法设计:对于给定的n个顾…...
使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件
Flask 文件和文件夹下载服务实现 以下是一个基于 Flask 框架的简单 Web 服务,用于开放指定文件夹(./shared_files),允许用户通过浏览器浏览和下载文件夹中的所有文件和子文件夹。ZIP 和 TAR 文件将直接下载,而文件夹将…...
【Go】从0开始学习Go
文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素(核心三部分)1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...
软件设计师SQL考点分析——求三连
一、考点分值占比与趋势分析 综合知识分值统计表(75分制) 年份考题数量分值分值占比考察重点2018334%关系代数、权限控制2019222.67%SQL注入、授权语句2020445.33%投影操作、权限回收2021334%视图操作、权限传递2022222.67%数据库安全、WITH GRANT OPT…...
使用tcs34725传感器和51单片机识别颜色
使用TCS34725颜色传感器和51单片机来识别颜色是一个非常有趣的项目。TCS34725是一种常用的RGB颜色传感器,能够测量红、绿、蓝光的强度,从而实现颜色识别。 1. 硬件连接 TCS34725传感器通过IC接口与51单片机连接。以下是连接方式: SDA&…...
数据库-oracle-包-视图传参
并发下可能不准确 -- 修改包规范 CREATE OR REPLACE PACKAGE sczz.p_view_param IS function set_n(n varchar2) return varchar2; function get_n return varchar2; function set_ny(ny varchar2) return varchar2; function get_ny return varchar2; …...
深入探讨Java中的上下文传递与ThreadLocal的局限性及Scoped Values的兴起
在Java开发中,特别是在依赖框架的应用程序中,上下文数据的管理是一个常见但具有挑战性的问题。上下文数据可能包括元数据、配置信息或其他需要在代码不同部分之间共享的信息。传统的做法是通过方法参数显式传递这些上下文,但这种方法会导致代码复杂、难以维护,尤其是在大型…...
Spring boot 学习笔记2
Maven 项目管理工具:Maven 通过 pom.xml(Project Object Model)文件描述项目配置,包括依赖、构建流程、插件等,实现项目标准化管理 依赖管理:自动下载并管理项目所需的第三方库(如 Spring、MyB…...
“保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板
保证医疗器械信息来源合法真实、安全的保障措施、情况说明及相关证明 一、医疗器械信息来源合法、真实、安全的管理措施 目前我公司网站所展示的医疗器械是企业代理品种,是取得合法注册资格的产品,拥有合法证明文件的产品。本网站仅展示本公司行政许可…...
Feature Toggle 不再乱:如何设计一个干净、安全、可控的特性开关系统?
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
不锈钢保温容器行业2025数据分析报告
不锈钢保温容器市场概况 2024年全球不锈钢保温容器市场规模约为453.3亿元,预计到2031年将增长至608.3亿元,年均复合增长率(CAGR)为4.3%。这一增长主要得益于全球范围内对保温容器需求的持续增加,尤其是在户外活动、餐…...
leetcode239 滑动窗口最大值deque方式
这段文字描述的是使用单调队列(Monotonic Queue) 解决滑动窗口最大值问题的优化算法。我来简单解释一下: 核心思路 问题分析:在滑动窗口中,若存在两个下标 i < j 且 nums[i] ≤ nums[j],则 nums[i] 永远…...
腾讯云怎么在游戏云中助力
腾讯云游戏云:依托深厚游戏基因,打造高质量全方位生态平台 在竞争激烈的云计算市场中,腾讯云凭借其得天独厚的游戏生态资源和深耕多年的技术沉淀,正成为游戏行业不可忽视的重要力量。腾讯不仅是全球领先的游戏开发和发行商&#…...
深入理解pip:Python包管理的核心工具与实战指南
# 深入理解pip:Python包管理的核心工具与实战指南 在Python开发中,第三方库是提升效率的关键。而pip作为Python官方的包管理工具,承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令,结合实例演示用法&#…...
【python】windows修改 pip 默认安装路径
在 Windows 系统 下,希望修改 pip 默认安装路径,结合你前面贴的图片和信息,一个 推荐做法(不修改 site.py)的完整教程。 目标:让 pip 安装包默认装到你指定的路径(如 D:\MyPythonLibsÿ…...
Python函数——万字详解
—— 小 峰 编 程 导 语: 从今天开始,我们将进入第二模块的学习——函数。第一模块主要是学习python基础知识,从第二模块开始就可以通过程序去解决工作中实际的问题。从今天开始,我们将进入第二模块的学习,此模块…...
es在已有历史数据的文档新增加字段操作
新增字段设置默认值 场景 在已经有大量数据的索引文档上,增加新字段 技术实现 一.更新索引映射 通过PUT请求显式定义新字段类型,确保后续写入的文档能被正确解析 PUT /文档名/_mapping {"properties": {"字段名1": {"type…...
LeetCode 35 搜索插入位置题解
LeetCode 35 搜索插入位置题解 题目描述 题目链接 给定一个排序数组和一个目标值,在数组中找到目标值并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置(需保证数组仍然有序)。要求时间复杂度为 O(log n)。…...
RabbitMQ通信模式(Simplest)Python示例
RabbitMQ通信模式-Python示例 0.RabbitMQ官网通信模式1.Simplest(简单)模式1.1 发送端1.2 接收端 0.RabbitMQ官网通信模式 1.Simplest(简单)模式 1.1 发送端 # -*- coding: utf-8 -*- """ Author: xxx date: 2025/5/19 11:30 Description: Simaple简单模…...
游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉项目游戏规则奇美拉(Chimeras)档案领队成员 结果展示: 奇美拉项目 由于项目工程较大,并且我打算把我的思考过程和实现过程中踩过的坑都分享一下,因此会分3-4篇博文详细讲解本项目。本文首先介绍下游戏规则并给出奇美拉档案。…...
力扣热题100之删除链表的倒数第N个节点
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 代码 方法一 将链表中的值放入列表中,然后删除倒数第n个值,再将剩下的数依次转化为链表 # Definition for singly-linked list. # class ListNode: # …...
OCframework编译Swift
建一个OC的framework: 需要对外暴露的OC文件,需要放到OC的.h文件中 framework中,OC类,调用framework中的Swift类: #import "WowAudioFocus/WowAudioFocus-Swift.h" //02 #import "{工程名}/{工程…...
【AI News | 20250519】每日AI进展
AI Repos 1、deepdrone DeepDrone是一款基于smolagents框架的无人机聊天代理,集成DroneKit实现无人机分析与操作。用户可通过自然语言聊天与无人机助手交互,实现飞行路径和传感器数据可视化、基于飞行时长的维护建议、任务规划以及真实的无人机控制&…...
分布式ID生成系统
代码地址: github mid 简介 分布式 ID 生成系统是一个高性能、可靠的 ID 生成服务,支持两种模式:Snowflake(基于时间戳的内存生成)和 Segment(基于 MySQL 的号段分配)。系统采用双 Buffer 策略优化性能,集成 Prometheus 监控和 Zap 结构化日志,确保高可用性和可观测性…...
MAC常用操作整理
音量方法: 电脑键盘的右上角就有静音和不静音的按钮,还有调节音量的按钮,调节屏幕亮度的按钮 切换输入法方法: 1.大写按键,2.function按键(fn), 3.control 空格键, 选择上一个输入法,4.controloption空格…...
【Canvas与图标】圆角方块蓝星CSS图标
【成图】 120*120的png图标 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…...
易境通散货拼柜系统:提高货代企业货物配载效率
在国际物流代理运输领域,货物配载是整个供应链的核心环节,其优化对于提升整个供应链的效率至关重要。传统的配载管理方式往往依赖人工操作,不仅效率低下,还容易出现错误。面对多订单、多货主、多目的地的复杂场景,传统…...
[Spring Boot]整合Java Mail实现Outlook发送邮件
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。 Outlook作为微软提供的企业电子…...
【盈达科技】GEO优化实战策略
提升内容在生成式引擎中的可见性:实战策略 随着生成式引擎(Generative Engines, GEs)的兴起,内容创作者面临着新的挑战和机遇。这些引擎通过整合和总结多源信息来提供精准且个性化的回答,正在迅速取代传统搜索引擎。为…...
HTTP 协议基础
本篇文章会从如下角度介绍 HTTP 协议: 原理与工作机制请求方法与状态码Header 与 Body 1、原理与工作机制 1.1 HTTP 是什么 HyperText Transfer Protocol,超文本传输协议,"超"表示扩展而非超级,即可以链接到其他文本…...
ros运行包,Ubuntu20.04成功运行LIO-SAM
zz:~/lio_sam_ws$ source devel/setup.bash zz:~/lio_sam_ws$ roslaunch lio_sam run.launch 创建包链接: 链接1:Ubuntu20.04成功运行LIO-SAM_ubuntu20.04运行liosam-CSDN博客 链接2:ubuntu 20.04 ROS 编译和运行 lio-sam,并且导出PCD文件…...
Linux《自主Shell命令行解释器》
在上一篇的进程控制当中我们已经了解了进程退出、进程等待以及进程替换的相关概念,那么在了解了这些的概念之后接下来在本篇当中我们就可以结合之前我们学习的知识来实现一个自主的Shell命令行解释器,通过Shell的实现能让我们进一步的理解操作系统当中的…...
设置IDEA打开新项目使用JDK17
由于最近在学习Spring-AI,所以JDK8已经不适用了,但是每次创建新项目都还是JDK8,每次调来调去很麻烦 把Projects和SDKs都调整为JDK17即可 同时,Maven也要做些更改,主要是添加build标签 <build><plugins>&…...
Vue百日学习计划Day36-42天详细计划-Gemini版
总目标: 在 Day 36-42 理解组件化开发的思想,熟练掌握 Vue 组件的注册、Props、Events、v-model、Slots、Provide/Inject 等核心概念和实践,能够构建可复用和易于维护的组件结构。 所需资源: Vue 3 官方文档 (组件基础): https://cn.vuejs.org/guide/es…...
Python对JSON数据操作
在Python中,对JSON数据进行增删改查及加载保存操作,主要通过内置的json模块实现。 一、基础操作 1. 加载JSON数据 • 从文件加载 使用json.load()读取JSON文件并转换为Python对象(字典/列表): import json with open…...
upload靶场1-5关
网上的解析有一些题目对应不上,比如第五关说是 空格 点 空格绕过 ,我这里就无法成功解析,但大小写绕过就成功了,慢慢会把后面的关卡也写出来 这里建议开一台win7的虚拟机,在上面搭建靶场,可以省很多麻烦 …...