Android第三次面试总结之activity和线程池篇(补充)
一、线程池高频面试题
1. 为什么 Android 中推荐使用线程池而非手动创建线程?(字节跳动 / 腾讯真题)
- 核心考点:线程池的优势、资源管理、性能优化
- 答案要点:
- 复用线程:避免重复创建 / 销毁线程的开销(单个线程创建耗时约 9ms,复用可降低延迟)。
- 控制并发:通过参数(
corePoolSize
/maxPoolSize
)控制最大并行任务数,防止 OOM(如大量并发网络请求导致内存溢出)。 - 队列管理:任务队列(如
LinkedBlockingQueue
)缓冲未执行任务,避免系统资源耗尽。 - 线程管理:后台线程自动回收,避免内存泄漏(手动创建线程若持有 Activity 引用,易导致 Activity 无法销毁)。
- 大厂真题延伸:
“如果项目中需要处理 1000 个耗时任务(如文件下载),如何设计线程池参数?”
答:根据任务类型选择策略:- 计算密集型:
corePoolSize
≈CPU 核心数(Android 设备常见 4-8 核); - IO 密集型:
corePoolSize
可适当增大(因 IO 等待时线程可空闲,如2*CPU核心数
); - 此处下载任务属 IO 密集型,可设
corePoolSize=5
,maxPoolSize=10
,队列选LinkedBlockingQueue
(有界队列避免内存溢出),拒绝策略用AbortPolicy
(抛异常提醒任务处理失败)。
- 计算密集型:
2. ThreadPoolExecutor 的核心参数有哪些?工作流程是什么?
- 核心参数(必背!):
public ThreadPoolExecutor(int corePoolSize, // 核心线程数,空闲时也会保持存活int maximumPoolSize, // 最大线程数,核心+临时线程总和long keepAliveTime, // 临时线程空闲时的存活时间TimeUnit unit, // 时间单位BlockingQueue<Runnable> workQueue, // 任务队列ThreadFactory threadFactory, // 线程工厂(自定义线程名,方便调试)RejectedExecutionHandler handler // 拒绝策略 );
- 工作流程(画图辅助理解):
- 任务提交,若线程数<
corePoolSize
,创建新线程执行; - 若线程数≥
corePoolSize
,任务入队(根据队列类型,如无界队列LinkedBlockingQueue
会一直排队); - 若队列已满且线程数<
maximumPoolSize
,创建临时线程执行; - 若队列已满且线程数≥
maximumPoolSize
,触发拒绝策略(4 种策略需背熟:AbortPolicy
/CallerRunsPolicy
/DiscardPolicy
/DiscardOldestPolicy
)。
- 任务提交,若线程数<
- 踩坑点:
“为什么不推荐使用 Executors 工具类创建线程池?”
答:Executors 创建的线程池存在隐患:newFixedThreadPool
/newSingleThreadExecutor
使用无界队列LinkedBlockingQueue
,任务大量堆积时可能 OOM;newCachedThreadPool
的maximumPoolSize
为Integer.MAX_VALUE
,突发大量任务时会创建海量线程,导致 CPU 过载。
正确做法:直接使用ThreadPoolExecutor
自定义参数,根据业务场景配置。
3. 线程池如何实现任务优先级?
- 核心思路:自定义任务队列,重写
offer()
/poll()
方法实现优先级排序。 - 代码示例:
// 优先级任务队列(实现Comparator) PriorityBlockingQueue<Runnable> priorityQueue = new PriorityBlockingQueue<>(10, (r1, r2) -> {if (r1 instanceof PriorityRunnable && r2 instanceof PriorityRunnable) {return ((PriorityRunnable) r2).getPriority() - ((PriorityRunnable) r2).getPriority(); // 高优先级先执行}return 0; }); // 创建线程池时使用该队列 ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 30, TimeUnit.SECONDS, priorityQueue );
- 面试加分项:结合实际场景(如直播场景中,弹幕渲染任务优先级高于日志上报),说明优先级队列的应用价值。
二、Activity 高频面试题
1. Activity 生命周期完整流程是什么?哪些场景会触发各个回调?
- 关键回调触发场景:
onCreate()
:Activity 创建时调用(初始化 UI、数据),系统异常重建时也会调用(需结合onSaveInstanceState
恢复数据)。onStart()
→onResume()
:Activity 可见 / 可交互时调用(区别:onStart
表示可见但可能在后台,onResume
表示位于前台)。onPause()
:Activity 失去焦点时调用(如跳转到新 Activity,需在此处停止动画、释放 CPU 资源,但避免耗时操作,否则影响新 Activity 启动)。onStop()
:Activity 完全不可见时调用(可执行较耗时操作,如保存数据,但需注意若用户快速返回,可能跳过onStop
直接调用onRestart
)。onDestroy()
:Activity 销毁时调用(释放所有资源,避免内存泄漏,如取消网络请求、解绑 Listener)。
- 大厂真题:
“横竖屏切换时,Activity 的生命周期如何变化?如何避免数据丢失?”
答:- 默认情况下,屏幕旋转会导致 Activity 销毁重建,生命周期走:
onPause()
→onStop()
→onDestroy()
→onCreate()
→onStart()
→onResume()
; - 避免数据丢失方案:
- 重写
onSaveInstanceState(Bundle)
保存临时数据(系统自动调用,在onStop()
前),onRestoreInstanceState(Bundle)
或onCreate(Bundle)
中恢复; - 在 Manifest 中给 Activity 添加
android:configChanges="orientation|screenSize"
,阻止重建,此时仅调用onConfigurationChanged()
。
- 重写
- 默认情况下,屏幕旋转会导致 Activity 销毁重建,生命周期走:
2. Activity 启动模式有哪些?应用场景是什么?
- 四大启动模式(必背!):
模式 核心特性 典型场景 standard
每次启动都创建新实例,默认模式,多实例共存(栈内可存在多个相同 Activity) 普通页面(如商品详情页) singleTop
若栈顶已有实例,不再创建,调用 onNewIntent()
消息通知页(避免重复打开顶部) singleTask
栈内唯一实例,启动时清除栈中该 Activity 以上的所有 Activity(单任务栈) 主页(如微信首页,需清空其他页面) singleInstance
全局唯一实例,独占一个任务栈,其他 Activity 需跳转至该栈调用 来电界面(独立于其他应用) - 进阶问题:
“如何理解任务栈(Task)和启动模式的关系?singleTask
为什么会清空栈顶?”
答:- 任务栈是 Activity 的容器,遵循 “后进先出”,每个应用默认有一个主任务栈;
singleTask
要求实例在栈内唯一,若目标栈中存在该 Activity,会清除其上方的所有 Activity,确保其成为栈顶(类似 “回到主页并清空中间页面”)。
“启动模式和IntentFlag
(如FLAG_ACTIVITY_NEW_TASK
)如何配合使用?”
答:FLAG_ACTIVITY_NEW_TASK
相当于singleTask
模式,优先级高于清单文件配置,二者同时存在时以IntentFlag
为准。
3. Activity A 启动 Activity B,如何回传数据?异常情况下(如 B 被系统杀死)如何保证数据不丢失?
- 常规方法:
- A 通过
startActivityForResult(Intent, requestCode)
启动 B; - B 通过
setResult(resultCode, data)
回传数据,A 在onActivityResult()
中处理; - 注意:Android 10 + 建议使用
ActivityResultContract
替代(更简洁安全,避免内存泄漏)。
- A 通过
- 异常场景处理:
- 若 B 在后台被系统杀死(内存不足),系统会保存其
onSaveInstanceState
数据,重建后onActivityResult()
仍会回调,但需在 B 的onCreate()
中恢复必要数据,确保setResult()
正常调用。
- 若 B 在后台被系统杀死(内存不足),系统会保存其
- 大厂真题延伸:
“如果 A 启动 B 后,B 又启动 C,C 如何直接返回数据给 A?”
答:- 传统方法:C→B→A 逐层回传(繁琐);
- 优化方案:使用事件总线(如 EventBus、LiveData),C 发送事件,A 订阅并处理(需注意解耦和内存泄漏,Activity 销毁时取消订阅)。
面试扩展:
一、线程池深度补充
1. 线程池中的线程为什么不会无限创建?核心源码解析
- 源码关键逻辑(
ThreadPoolExecutor.execute(Runnable command)
):public void execute(Runnable command) {if (command == null) throw new NullPointerException();int c = workerCountOf(ctl.get());// 步骤1:若当前线程数 < 核心线程数,创建核心线程执行任务if (c < corePoolSize) {if (addWorker(command, true)) return;c = workerCountOf(ctl.get());}// 步骤2:若线程数 >= 核心线程数,将任务加入队列if (isRunning(c) && workQueue.offer(command)) {int recheck = workerCountOf(ctl.get());// 再次检查线程池状态(防止加入队列后线程池已关闭)if (!isRunning(recheck) && remove(command))reject(command);else if (workerCountOf(recheck) == 0)addWorker(null, false); // 确保至少有一个核心线程存在(allowCoreThreadTimeOut=false时)}// 步骤3:队列已满,创建非核心线程(直到maxPoolSize),失败则触发拒绝策略else if (!addWorker(command, false))reject(command); }
- 核心控制逻辑:
- 通过
ctl
变量(32 位整数,高 3 位表示状态,低 29 位表示线程数)原子性控制线程创建和状态转换; addWorker
方法会检查线程数是否超过maximumPoolSize
,确保线程数不超过上限。
- 通过
2. 如何监控线程池的运行状态?大厂性能优化必问题
- 关键监控指标:
方法 含义 应用场景 getActiveCount()
当前正在执行任务的线程数 判断线程池是否繁忙(如扩容依据) getCompletedTaskCount()
已完成的任务总数 统计任务处理效率 getQueue().size()
等待执行的任务数 预警队列堆积(如超过阈值时扩容) getLargestPoolSize()
线程池曾创建的最大线程数 分析峰值负载,优化 maxPoolSize
- 实战方案:
// 定时打印线程池状态(建议在后台线程执行) ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor(); monitor.scheduleAtFixedRate(() -> {log.d("Thread pool status: " +"active=" + executor.getActiveCount() +", queueSize=" + executor.getQueue().size() +", completed=" + executor.getCompletedTaskCount()); }, 0, 5, TimeUnit.SECONDS);
- 大厂真题:
“如果发现线程池队列持续堆积,如何排查和解决?”
答:- 检查任务处理耗时是否过长(可能存在耗时操作未优化);
- 确认
corePoolSize
是否过小(IO 密集型任务可适当增大); - 若使用有界队列,可临时增大队列容量或调整
maxPoolSize
; - 考虑任务优先级,拆分高优先级任务到独立线程池。
3. WorkManager vs 线程池:Android 后台任务如何选择?
- 核心区别:
特性 线程池(ThreadPoolExecutor) WorkManager 生命周期管理 依赖宿主(如 Activity)手动关闭 系统级管理,支持跨进程、跨重启执行 持久化任务 不支持(任务丢失后需手动重启) 支持(通过 WorkRequest
配置持久化)约束条件 无(需自行处理网络、电量等限制) 支持网络状态、充电状态等约束 适用场景 短期、实时性任务(如网络请求) 长期后台任务(如日志上报、定时同步) - 大厂最佳实践:
- 前台实时任务(如界面数据加载):使用线程池 + Activity 生命周期绑定;
- 后台异步任务(如下载、定时任务):优先使用 WorkManager(避免后台服务被系统杀死,兼容 Android 12 + 前台服务限制)。
二、Activity 深度补充(Framework 层原理 + 实战坑点)
1. Activity 启动流程
- 极简流程图:
用户操作 → Launcher发送启动Intent → AMS(ActivityManagerService)查询目标Activity信息 → 若目标进程未启动,创建ProcessRecord → 创建ActivityThread → 创建Activity实例 → 依次调用Activity的生命周期回调(onCreate→onStart→onResume)
- 面试高频问题:
“Activity 启动时,AMS 如何处理任务栈?singleInstance
模式为什么独占一个任务栈?”
答:- AMS 维护一个任务栈列表,每个任务栈有独立的 Task ID;
singleInstance
模式要求 Activity 在全局唯一,因此 AMS 会为其创建新的任务栈,确保其他 Activity 无法进入该栈,实现 “独占”。
2. onSaveInstanceState vs onRestoreInstanceState:必坑细节
- 调用时机:
onSaveInstanceState
:非用户主动销毁时调用(如系统内存不足、配置变更),用户按 Back 键不会调用(因 Activity 是主动销毁,无需保存);onRestoreInstanceState
:在onStart()
之后、onResume()
之前调用,仅当 Activity 有保存的 InstanceState 时触发。
- 数据丢失场景:
“如果在 onSaveInstanceState 中保存了 EditText 内容,为什么旋转屏幕后内容还在,但用户按 Back 键退出再进入就丢失了?”
答:- 旋转屏幕属于配置变更,系统自动保存并恢复
InstanceState
; - 按 Back 键退出时 Activity 被主动销毁,
onSaveInstanceState
不会调用,因此未保存数据,再次进入时需通过onCreate
的参数或ViewModel
恢复。
- 旋转屏幕属于配置变更,系统自动保存并恢复
- 最佳实践:
- 临时 UI 状态(如 EditText 内容、列表滚动位置):用
onSaveInstanceState
; - 持久化数据(如用户登录状态、网络请求结果):用
ViewModel
(不随 Activity 销毁而销毁)或SharedPreferences
。
- 临时 UI 状态(如 EditText 内容、列表滚动位置):用
3. Activity 异常销毁(系统回收)后的恢复策略
- 三大恢复方案对比:
方案 数据类型 生命周期感知 优缺点 onSaveInstanceState 临时 UI 状态(可序列化) 仅处理配置变更 / 内存回收 简单易用,但数据需可序列化,且 Back 键不触发 ViewModel 与界面相关的业务数据 感知 Activity/Fragment 生命周期 不随配置变更销毁,需配合 LiveData 更新 UI SavedStateHandle 键值对数据(Jetpack) 替代传统 InstanceState 类型安全,支持更复杂数据结构(如 List) - 代码示例(ViewModel + SavedStateHandle):
class MyViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {private val _userData = savedStateHandle.getLiveData<String>("user_data")val userData: LiveData<String> get() = _userDatafun saveData(data: String) {savedStateHandle["user_data"] = data // 自动保存,Activity重建时恢复} }
三、最新大厂真题实战
1. 字节跳动:如何设计一个线程池,让高优先级任务优先执行,同时避免低优先级任务饿死?
- 解题思路:
- 使用
PriorityBlockingQueue
作为任务队列,自定义任务优先级比较器; - 限制高优先级任务的并发数,避免低优先级任务长期无法执行(“公平性策略”)。
- 使用
- 关键代码:
// 自定义优先级任务 class PriorityRunnable(private val priority: Int, private val runnable: Runnable) implements Runnable, Comparable<PriorityRunnable> {@Overridepublic void run() { runnable.run(); }@Overridepublic int compareTo(PriorityRunnable o) {return o.priority - this.priority; // 数值越大优先级越高} }// 线程池配置 ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 8, 30, TimeUnit.SECONDS,new PriorityBlockingQueue<>(),(r) -> new Thread(r, "PriorityThread-" + counter.incrementAndGet()) );
- 进阶回答:
补充 “饥饿解决方案”:设置最低执行配额(如每执行 N 个高优先级任务,必须执行 1 个低优先级任务),或使用公平队列(如按提交顺序混合执行)。
2. 美团:Activity A 启动 Activity B 时,B 的主题设置为透明(android:theme="@android:style/Theme.Translucent"),A 的生命周期如何变化?
- 核心考点:Activity 可见性对生命周期的影响
- 答案:
- 若 B 为透明主题,A 未完全遮挡,A 只会调用
onPause()
(保持部分可见),不会调用onStop()
; - 若 B 为非透明主题(完全覆盖 A),A 会调用
onPause()
→onStop()
。
- 若 B 为透明主题,A 未完全遮挡,A 只会调用
- 延伸问题:
“如何判断一个 Activity 是否在前台可见?”
答:- 通过
isResumed()
(前台可交互)或重写ActivityLifecycleCallbacks
监控所有 Activity 的onResume
/onPause
; - 注意:透明 Activity 可能让底层 Activity 处于 “可见但非焦点” 状态,需结合
getWindowVisibility()
判断。
- 通过
相关文章:
Android第三次面试总结之activity和线程池篇(补充)
一、线程池高频面试题 1. 为什么 Android 中推荐使用线程池而非手动创建线程?(字节跳动 / 腾讯真题) 核心考点:线程池的优势、资源管理、性能优化答案要点: 复用线程:避免重复创建 / 销毁线程的开销&…...
【Trae+LucidCoder】三分钟编写专业Dashboard页面
AI辅助编码作为一项革命性技术,正在改变开发者的工作方式。本文将深入探讨如何利用Trae的AI Coding功能构建专业的Dashboard页面,同时向您推荐一个极具价值的工具——Lucids.top,它能够将页面截图转换为AI IDE的prompt,从而生成精…...
CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化
NVIDIA 近日发布了 CUDA Toolkit 12.9,为开发者提供了一系列新功能和改进,旨在进一步提升 GPU 加速应用的性能和开发效率。CUDA Toolkit 是创建高性能 GPU 加速应用的关键开发环境,广泛应用于从嵌入式系统到超级计算机的各种计算平台。 新特…...
chrome 浏览器怎么不自动提示是否翻译网站
每次访问外国语网页都会弹出这个对话框,很是麻烦,每次都得手动关闭一下。 不让他弹出来方法: 设置》语言》首选语言》添加语言,搜索英语添加上 如果需要使用翻译,就点击三个点,然后选择翻译...
编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要
2025年4月22日,Embarcadero发布了针对RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月补丁。此更新旨在提升这些产品的质量,特别关注于Delphi编译器、C 64位现代工具链、RAD Studio 64位IDE及其调试器、VCL库和其他RAD Studio特性。强烈建议所有使…...
Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
始终报错 . 补充链接 tinfo 库时报错软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本 没有可用软件包 tinfo-devel。 无须任何处理 make LDLIBS“-lncurses"报错编译时报错make LDLIBS”-lncurses" ? /opt/rh/devtoolset-11/roo…...
驱动开发硬核特训 · Day 27(上篇):Linux 内核子系统的特性全解析
在过去数日的练习中,我们已经深入了解了字符设备驱动、设备模型与总线驱动模型、regulator 电源子系统、I2C 驱动模型、of_platform_populate 自动注册机制等关键模块。今天进入 Day 27,我们将正式梳理 Linux 内核子系统的核心特性与通用结构,…...
【学习笔记】深度学习:典型应用
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接…...
万字详解ADC药物Payload
抗体药物偶联物(ADC)是一种有前景的癌症治疗方式,能够选择性地将有效载荷(Payload)细胞毒性分子递送至肿瘤,降低副作用的严重程度。通常ADC由3个关键成分组成:抗体,连接子和有效载荷…...
算法笔记.求约数
代码实现: #include<iostream> using namespace std; #include<vector> void check(int x) {vector<int> v;for(int i 1;i< x/i;i){if(x%i 0) {cout << i<<" ";v.push_back(i);}}for(int i v.size()-1;i>0;i--){…...
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体,安装路径不能带有中文,或其它非常规拉丁字符; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明 DLC 解锁列表&…...
启发式算法-遗传算法
遗传算法是一种受达尔文生物进化论和孟德尔遗传学说启发的启发式优化算法,通过模拟生物进化过程,在复杂搜索空间中寻找最优解或近似最优解。遗传算法的核心是将问题的解编码为染色体,每个染色体代表一个候选解,通过模拟生物进化中…...
生成式AI将重塑的未来工作
在人类文明的长河中,技术革命始终是推动社会进步的核心动力。从蒸汽机的轰鸣到互联网的浪潮,每一次技术跃迁都在重塑着人类的工作方式与生存形态。而今,生成式人工智能(Generative AI)的崛起,正以超越以往任何时代的速度与深度,叩响未来工作范式变革的大门。这场变革并非…...
【操作系统】吸烟者问题
问题描述 吸烟者问题是一个经典的同步问题,涉及三个抽烟者进程和一个供应者进程。每个抽烟者需要三种材料(烟草、纸和胶水)来卷烟,但每个抽烟者只有一种材料。供应者每次提供两种材料,拥有剩下那种材料的抽烟者可以卷烟…...
mysql-内置函数,复合查询和内外连接
一 日期函数 函数名称描述示例current_date()返回当前日期(格式:yyyy-mm-dd)select current_date(); → 2017-11-19current_time()返回当前时间(格式:hh:mm:ss)select current_time(); → 13:51:21current…...
软件架构之旅(6):浅析ATAM 在软件技术架构评估中的应用
文章目录 一、引言1.1 研究背景1.2 研究目的与意义 二、ATAM 的理论基础2.1 ATAM 的定义与核心思想2.2 ATAM 涉及的质量属性2.3 ATAM 与其他架构评估方法的关系 三、ATAM 的评估流程3.1 准备阶段3.2 场景和需求收集阶段3.3 架构描述阶段3.4 评估阶段3.5 结果报告阶段 四、ATAM …...
【SQL触发器、事务、锁的概念和应用】
【SQL触发器、事务、锁的概念和应用】 1.触发器 (一)触发器概述 1.触发器的定义 触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。 触发器基于一个表创建,…...
5.4学习记录
今天的目标是复习刷过往的提高课的DP题目:重点是数位DP,状态压缩DP,然后去做一些新的DP题目 然后明天的任务就是把DP的题目汇总,复习一些疑难的问题 方格取数: 题目背景 NOIP 2000 提高组 T4 题目描述 设有 NN 的方…...
Hadoop 1.x设计理念解析
一、背景 有人可能会好奇,为什么要学一个二十年前的东西呢? Hadoop 1.x虽然是二十年前的,但hadoop生态系统中的一些组件如今还在广泛使用,如hdfs和yarn,当今流行spark和flink都依赖这些组件 通过学习它们的历史设计…...
缓存与数据库的高效读写流程解析
目录 前言1 读取数据的流程1.1 检查缓存是否命中1.2 从数据库读取数据1.3 更新缓存1.4 返回数据 2 写入数据的流程2.1 更新数据库2.2 更新或删除缓存2.3 缓存失效 3 缓存与数据库的一致性问题3.1 写穿(Write-through)策略3.2 写回(Write-back…...
Linux中的粘滞位和开发工具和文本编辑器vim
1.粘滞位的使用的背景: 当几个普通用户需要文件共享操作时,他们就需要在同一个目录下进行操作,那么就诞生一个问题,由谁来创建这个公共的目录文件?假设是由其中的一个普通用户来创建一个默认的目录文件,这就…...
冯诺依曼结构与哈佛架构深度解析
一、冯诺依曼结构(Von Neumann Architecture) 1.1 核心定义 由约翰冯诺依曼提出,程序指令与数据共享同一存储空间和总线,通过分时复用实现存取。 存储器总带宽 指令带宽 数据带宽 即:B_mem f_clk W_data f_…...
如何提升个人情商?
引言 提升个人情商(EQ)是一个持续的自我修炼过程,涉及自我认知、情绪管理、人际沟通等多个方面。以下是一些具体且可实践的方法,帮助你逐步提升情商: 一、提升自我觉察能力 1. 记录情绪日记 每天回顾自己的情绪…...
JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过
引言 在web开发中,对于用户认证的问题,有很多的解决方案。其中传统的认证方式:基于session的用户身份验证便是可采用的一种。 基于session的用户身份验证验证过程: 用户在用进行验证之后,服务器保存用户信息返回sess…...
K230的ISP(图像信号处理器)通常支持多通道输出,常见配置为3个独立通道
也就是一个摄像头可以拍摄三种配置的图片,这样就可以调用三种: img_try sensor.snapshot(chnCAM_CHN_ID_0) img_try2 sensor.snapshot(chnCAM_CHN_ID_1) img_try3 sensor.snapshot(chnCAM_CHN_ID_2) 这样可以一图多用 eg: # 初始化并配…...
工程师 - 小米汽车尾部主动扩散器
关于小米SU7 Ultra的主动尾部扩散器,其设计初衷是为了平衡日常驾驶的节能需求与运动驾驶的操控性能。这一装置位于车辆尾部下方,具备自动调节功能,能够根据车速在0和32之间切换,同时也支持手动调整。 32度打开状态: 0度…...
Linux watch 命令使用详解
简介 watch 命令会以固定间隔(默认每 2 秒)重复运行给定命令,并在终端上显示其输出。它非常适合监控不断变化的输出,例如磁盘使用情况、内存使用情况、文件更改、服务状态等。 基础语法 watch [options] command常用选项 -n, -…...
RabbitMQ-基础
RabbitMQ-基础 文章目录 RabbitMQ-基础1.同步调用2.异步调用3.技术选型4.安装RabbitMQ(官方网址)https://www.rabbitmq.com/5.快速入门5.1收发消息5.1.1交换机5.1.2队列5.1.3绑定关系5.1.4发送消息 5.2数据隔离5.2.1用户管理5.2.2virtual host 6.Java客户端操作RabbitMQ6.1快速…...
第九周作业
安全专题笔记 1、文件上传 (1) 服务端白名单绕过 %00截断绕过要求虚拟机中搭建实验环境,分别实现GET、POST方法的绕过 前提条件: 1 php的版本需要在5.4以下 2 magic_quotes_gpc需要设置为off 启动phpstudy,前往php-ini将magic_quotes_gpc…...
AtCoder Beginner Contest 404 C-G(无F)题解
C. Cycle Graph? 题意 给你一个 N N N 个顶点 M M M 条边的简单(无重边、自环)无向图,第 i i i 条边连接节点 A i A_i Ai 和 B i B_i Bi,判断这个图是不是一个环。 思路 首先一个图是环,要满足点数等于边…...
Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)
一、模型评估 1. 准确率(Accuracy):这是最基本的评估指标之一,表示模型在测试集上正确 分类样本的比例。对于分类任务而言,准确率是衡量模型性能的直观标准。 2. 损失函数值(Loss)࿱…...
开上“Python跑的车”——自动驾驶数据可视化的落地之道
开上“Python跑的车”——自动驾驶数据可视化的落地之道 一、自动驾驶离不开“看得见”的智能 在智能汽车时代,自动驾驶已然不是“炫技”标签,而是一场技术实力的全面拉锯战。而在这场战役中,有一个极其关键但常被忽略的领域,叫做: 数据可视化(Data Visualization)。 为…...
Linux内核gcov修改为模块
Linux内核gcov修改为模块 Gcov 是 GNU 项目开发的代码覆盖率分析工具,与 GCC 编译器深度集成,用于统计程序运行时代码的执行情况,帮助开发者评估测试用例的完整性和代码质量。 Gcov工作原理 1. 编译插桩 编译时需添加 -fprofile-arcs -…...
【安装配置教程】linux部署AList记录
之前朋友安利给自己AList,这个工具可以很方便的管理个人的网盘内容,可以随时上传下载拉取,于是心血来潮自己部署并记录一下。 一、拉取下载脚本 在AList官网,找到安装下面的一键脚本 curl -fsSL "https://alist.nn.ci/v3.sh…...
题解:AT_abc245_e [ABC245E] Wrapping Chocolate
我绝对不会告诉你我打比赛时没做出来这道题。 题目简化:给定每个巧克力和盒子的长宽,已知每个盒子只能放一块巧克力,并且必须保证巧克力能放下,求是否所有巧克力都能放入。 思路:贪心、二分、排序、STL。 首先看到这…...
Linux 入门:操作系统进程详解(上)
目录 一.冯诺依曼体系结构 一). 软件运行前为什么要先加载?程序运行之前在哪里? 二).理解数据流动 二.操作系统OS(Operator System) 一).概念 二).设计OS的目的 三).如何理解操作系统…...
5.7/Q1,GBD数据库最新文章解读
文章题目:Global, regional, and national burden and trends of rheumatoid arthritis among the elderly population: an analysis based on the 2021 Global Burden of Disease study DOI:10.3389/fimmu.2025.1547763 中文标题:全球、区域…...
[pdf,epub]292页《分析模式》漫谈合集01-59提供下载
《分析模式》漫谈合集01-59的pdf、epub文件提供下载,地址: umlchina.com/url/ap.html,或查看本账号的CSDN资源。 已排版成适合手机阅读,pdf的排版更好一些。...
Spring MVC的工作流程, DispatcherServlet 的工作流程
Spring MVC 是一种基于Java的模型-视图-控制器(MVC)Web框架,它通过清晰的角色划分简化了Web应用开发。下面是Spring MVC的工作流程以及DispatcherServlet的具体工作流程。 Spring MVC 工作流程 请求到达:客户端发起一个HTTP请求…...
【Godot】使用 Shader 实现可配置圆角效果
文章目录 效果预览实现原理完整Shader代码关键参数详解1. 半径参数(radius)2. 角开关参数(hide_*)数学原理圆形区域判定公式坐标映射性能优化使用示例编辑器操作代码控制进阶技巧1. 添加抗锯齿2. 外发光效果3. 动画效果常见问题解决方案问题1:圆角边缘锯齿问题2:圆形变形…...
【翻译、转载】MCP 提示 (Prompts)
原文地址:https://modelcontextprotocol.io/docs/concepts/prompts#python 提示 (Prompts) 创建可重用的提示模板和工作流 提示 (Prompts) 使服务器能够定义可重用的提示模板和工作流,客户端可以轻松地将其呈现给用户和 LLM。它们提供了一种强大的方式来…...
论快乐的学习和学习的快乐
目录 一、背景二、过程1.快乐的学习:理念与实践快乐学习的理念溯源快乐学习在教育实践中的体现 2.学习的快乐:内涵与价值学习的快乐的多维内涵学习的快乐对个人成长的价值 3.快乐的学习与学习的快乐的相互关系快乐的学习是学习快乐的重要前提学习的快乐是…...
Git 命令
参考文献: Git 教程 | 菜鸟教程Git 使用教程:最详细、最正宗手把手教学(万字长文)git忽略某个目录或文件不上传 文章目录 工作原理基本命令配置使用 其他命令日志分支回退标签 忽略指定文件远程仓库 工作原理 Git 是由 Linus To…...
365打卡第R6周: LSTM实现糖尿病探索与预测
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 🏡 我的环境: 语言环境:Python3.10 编译器:Jupyter Lab 深度学习环境:torch2.5.1 torchvision0…...
新能源实验室电磁兼容设计优化方案论述
摘要:本文旨在进行新能源核心部件/系统测试实验室电磁兼容情况设计及优化方案进行论述,通过系统化梳理实验室的主流设备仪器,试验搭建典型方案。识别不同设备的电磁兼容现状,实验室基于设备布局常见设计方案不足点,故障…...
计算机图形学中的深度学习
文章目录 零、前言0.课程考核1.课程大纲2.前置知识3.教材4.课程大纲5.相关课程 Relevant Courses 一、计算机图形学1.本章学习目标2.图形学的应用3.SIG Graph papers 二、基本图形生成算法1.本章学习目标2.图形API3.OpenGL(1)什么是OpenGL(2)OpenGL 的基本组件:顶点…...
RockyLinux9.3-24小时制
在 RockyLinux 9.3 中,默认时间格式为 12 小时制,调整为 24 小时制 案例一:在 RockyLinux 9.3 中,默认时间格式为 12 小时制,调整为 24 小时制案例二:时间显示英文调整为中文endl 案例一:在 Roc…...
25.2linux中外置RTC芯片的PCF8563实验(测试)_csdn
1、硬件原理图分析 知道了这些引脚我们还是按照老习惯! 配置镜像和设备树文件! 2、修改设备树 2.1、添加或者查找 PCF8563 所使用的 IO 的 pinmux 配置 打开stm32mp15-pincrtl.dtsi 文件,查找节点I2C4: 也就是中断引脚并不需要配置pinctrl…...
高性能 WEB 服务器 Nginx:多虚拟主机实现!
Nginx 配置多虚拟主机实现 多虚拟主机是指在一台 Nginx 服务器上配置多个网站 在 Nginx 中,多虚拟主机有三种实现方式: 基于IP地址实现多虚拟主机 基于端口号实现多虚拟主机 基于域名实现多虚拟主机 1 基于域名实现多虚拟主机 在 Nginx 中配置多个…...
C++ 的类型排序
0.前言 在 C 中,我编写了一个 tuple-like 模板,这个模板能容纳任意多且可重复的类型: template<typename... Ts> struct TypeList {};// usage: using List1 TypeList<int, double, char, double>; using List2 TypeList<…...