本篇重点介绍一下SystemServerInitThreadPool,顾名思义此类针对SystemServer进程的提供了一套ThreadPool线程池的统一标准方案,下面从源码和日志的角度来剖析一个这个类。

1、SystemServerInitThreadPool单例设计

SystemServerInitThreadPool的源码路径在frameworks/base/services/core/java/com/android/server,如下代码其构造方法被定义为private,且存在静态类sInstance,这是一种典型的单例设计模式。

那么为什么这里采用了单例的设计模式呢?从后文可以看出来SystemServer的各个子服务都会通过这个类来执行耗时任务,因此单例设计是最优选,并且对sInstance进行了加锁保证线程安全。

2、SystemServerInitThreadPool何时启动?

第一节介绍了构造方法被private修饰,那么何时被构造何时被启动呢?

接下来继续看看start方法,该方法被定义为static方法,方法内通过LOCK去进行实例化,因此是一个典型的单例模式。

那么何时调用start方法呢?如下代码在SystemServer进程的主流程中,并且放到了startxxx之前,为什么要放在这里呢?因为后续的三部曲都需要使用该类去执行一些子线程的任务。

我们来看一下SystemServerInitThreadPool启动日志:可以看出来线程池的长度为8

3、SystemServerInitThreadPool任务执行

继续看一下submit方法,改方法为静态方法,供其他XXXService进行调用,最后移交给submitTask方法来创建启动线程池。这里的mService就是构造方法中通过mSize创建的线程池。

接下来看看在开机过程中,有哪些服务在调用这个方法创建子任务呢?

下面举几个submit的示例:

1)ReadingSystemConfig

这里很奇怪的是第一个参数应该是Runnable接口,第二个参数是字符串用来进行描述,但是这里的第一个参数直接返回了SystemConfig的实例,且该类没有找到实现Runnable接口的地方?

//frameworks/base/core/java/com/android/server/SystemConfig.java 
public class SystemConfig {static final String TAG = "SystemConfig";static SystemConfig sInstance;public static SystemConfig getInstance() {if (!isSystemProcess()) {Slog.wtf(TAG, "SystemConfig is being accessed by a process other than " + "system_server.");}synchronized (SystemConfig.class) {if (sInstance == null) {sInstance = new SystemConfig();}return sInstance;}}SystemConfig() {TimingsTraceLog log = new TimingsTraceLog(TAG, Trace.TRACE_TAG_SYSTEM_SERVER);log.traceBegin("readAllPermissions");TDSystemConfig.getInstance();// TINNO modified by guobing.xiong 20230208 LIBRA-400try {readAllPermissions();readPublicNativeLibrariesList();} finally {log.traceEnd();}}//....
}

这个案例直接传递了SystemConfig单例对象进去,此单例对象在构造函数中去做readAllPermissions文件处理,这是一个耗时任务,因此使用了子线程的方式。

2)prepareAppData

如上代码这里也没有传递一个Runnable接口,而是直接传递一个代码块,其中代码块用{}包裹,第二个参数传递prepareAppData,即任务描述,即第一个参数的代码块将在子线程中执行。

3)StartNativeSensorService

如上代码,启动native进程的服务,也通过了子线程的方式进行了启动,第二个参数直接把服务名传递了进去。

4、SystemServerInitThreadPool任务停止

如上日志表示SystemServerInitThreadPool调用shutdown进行终止所有线程池,我们来看看这段代码逻辑:

由此可见在开机完成之后,会主动调用SystemServerInitThreadPool.shutdown方法用来停止线程池中的所有任务,从上面的日志可以看出来,这些任务并不是直接暴力停止的,而是等待他们自己执行完成,具体实现如下:

PS:注意此段日志表示开机完成,非系统请求关机的日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96908.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96908.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96908.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析

一、分析赛题核心意义收集近 11 年的赛题并非简单的 “题目存档”,而是为了从历史规律、能力匹配、实战准备三个维度为参赛者或研究者提供价值。1.1把握竞赛命题趋势,降低选题盲目性赛题命题往往紧扣当年社会热点、科技前沿与行业痛点(如 202…

一个头像图片滚动轮播组件(React实现)

遇到一个效果,组件库里没有现成能用的组件,于是手搓了一个,传入图片url列表,和其他配置项即可直接使用。 轮播效果实现思路 假设共有10张图片轮流滚动,轮播图展示3张图片。给正在轮播的图片绑定visible类,轮…

从入门到理解:支持向量机的核心原理与实战思路

一、SVM 的核心目标:找 “最好” 的超平面。1.1 什么是 “超平面”?超平面是一个几何概念,简单来说:在 2 维空间(平面)中,超平面是一条直线(1 维);在 3 维空间…

Python 办公自动化实战:Excel 批量处理 + 自动发邮件

Python 办公自动化实战:Excel 批量处理 自动发邮件关键词: Python办公自动化 • Pandas • OpenPyXL • Email • 定时任务 摘要: 每月底还在手动处理几十份Excel报表并邮件发送?快来学习如何用Python全自动完成!本文…

高教杯数学建模2021-C 生产企业原材料的订购与运输

某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料, 总体可分为 A,B,C 三种类型。该企业每年按 48 周安排生产,需要提前制定 24 周的原 材料订购和转运计划,即根据产能要求确定需要订购的原材料供应商&…

【Python系列】Flask 和 FastAPI对比

博客目录1. 类型和设计目标2. 性能3. 异步支持4. 数据验证和文档5. 学习曲线和生态6. 使用场景示例对比Flask(同步)FastAPI(异步)总结Flask 和 FastAPI 都是 Python 中流行的 Web 框架,但它们的设计目标、特性和适用场…

把 AI 塞进「空调遥控器」——基于 MEMS 温湿阵列的 1 分钟极速房间热场扫描

标签:MEMS 阵列、热场扫描、极速空调、TinyML、RISC-V、零样本、离线推理、节能 ---- 背景:为什么空调遥控器要「画图」? 传统空调只有一个温湿度探头,经常“东边冷、西边热”。 • 大客厅 30 ㎡,温差 5 ℃&#xff1…

【机器学习】8 Logistic regression

本章目录 8 Logistic regression 245 8.1 Introduction 245 8.2 Model specification 245 8.3 Model fitting 245 8.3.1 MLE 246 8.3.2 Steepest descent 247 8.3.3 Newton’s method 249 8.3.4 Iteratively reweighted least squares (IRLS) 250 8.3.5 Quasi-Newton (variabl…

C++中如何使用互斥(1)------std::lock_guard

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 算法描述 std::lock_guard 是 C11 引入的一个 RAII(Resource Acquisition Is Initialization)风格的锁管理类,用于自动管理互斥锁(mutex&#x…

AI算力提升7.5倍!英伟达发布新一代机器人超级计算机Jetson Thor,驱动物理AI革命

今天,NVIDIA 宣布其专为物理 AI 和机器人打造的新一代机器人计算机 Jetson Thor 正式发售。其中,Jetson AGX Thor 开发者套件售价为 3499 美元(约合人民币 2.5 万元)。NVIDIA 创始人兼首席执行官黄仁勋表示:“Jetson T…

【数学建模】如何总结数学建模中的层次分析法最好

模型简介模型名称:层次分析法核心问题类型:评价类核心思想和适用场景 核心思想:将大决策问题拆解成小比较问题,通过数学计算综合最终结论:本质是人的主观判断转换为客观数据的工具[[适用场景]] 个人决策企业 / 项目决策…

`mmap` 系统调用详解

mmap 是 Unix/Linux 系统中一个强大且多用途的系统调用,用于将文件或设备映射到进程的地址空间,实现内存映射I/O。 1. 函数的概念与用途 mmap(内存映射)函数允许程序将文件或其他对象直接映射到其地址空间,这样文件内容…

深度剖析Spring AI源码(二):Model抽象层 - “驯服”天下AI的“紧箍咒”

深度剖析Spring AI源码(二):Model抽象层 - “驯服”天下AI的“紧箍咒”上一章我们鸟瞰了Spring AI的宏伟蓝图,今天,我们要深入这座大厦的基石——Model抽象层。如果说Spring AI是连接Java与AI世界的桥梁,那…

永磁同步电机无速度算法--高频脉振正弦波注入到两相静止坐标系

一、原理介绍采用一种改进的永磁同步电机低速无位置传感器控制策略。与传统的旋转高频信号注入法和脉振高频信号注入法不同,该策略选择向静止坐标轴系注入高频脉振信号,转子位置估计信息可以通过载波电流响应提取。并使用一种类似于简化型扩展卡尔曼滤波…

嵌入式学习日志————ADC模数转换器之实验

1.配置ADC的步骤①开启RCC时钟,包括ADC和GPIO的时钟②配置GPIO,把相应端口配置成模拟输入模式③配置多路开关,把左边的通道接入右边的规则组列表里④配置ADC转换器⑤调用ADC_Cmd函数,开启ADC2.库函数配置ADCCLK分频器void RCC_ADC…

Java设计模式之《状态模式》

目录 1、状态模式 1.1、介绍 1.2、设计背景 1.3、适用场景 2、实现 2.1、if-else实现 2.2、状态模式实现 2.3、最终版 1、关于if-else的优化 2、状态模式下的优化 3、ArrayList 配置“状态流” 3、总结 前言 关于Java的设计模式分类如下: 对于状态模式…

three.js+WebGL踩坑经验合集(9.2):polygonOffsetFactor工作原理大揭秘

本篇延续上篇内容: three.jsWebGL踩坑经验合集(9.1):polygonOffsetUnits工作原理大揭秘-CSDN博客 跟polygonOffsetUnits相比,polygonOffsetFactor的系数m要复杂得多,因为它跟平面的视角相关,而不像r那样,在一个固定的…

C++高级特性与设计模式答案

目录 C++高级特性与设计模式:从资源管理到架构设计 一、C++高级特性:超越基础语法的利器 1. 什么是RAII(资源获取即初始化)?它有什么作用? 实现原理 核心作用 2. 什么是Pimpl惯用法?它有什么优势? 实现方式 核心优势 3. 什么是CRTP(奇异递归模板模式)?它的应用场景是…

论文阅读:arxiv 2025 Can You Trick the Grader? Adversarial Persuasion of LLM Judges

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Can You Trick the Grader? Adversarial Persuasion of LLM Judges https://arxiv.org/pdf/2508.07805 https://www.doubao.com/chat/17534937260220418 文章目录论文翻译…

6pen Art

本文转载自:6pen Art - Hello123工具导航 ** 一、🎨 6pen 是什么? 6pen 是一款由国内团队开发的 AI 绘画工具,让你只需用文字描述想法,就能瞬间生成惊艳的视觉画作。不管是写实风景还是抽象概念,它都能理…