当前位置: 首页 > news >正文

Android 基础类(01)- Thread类 - readyToRun和threadLoop

一、前言:

在阅读AOSP代码过程中,我们经常会看到Thread子类重写两个方法:readyToRunthreadLoop,不清楚的同学,可能在这儿连调用逻辑都搞不清楚了,因为找不到谁调用了它。我这儿先不去深究Thread内部逻辑,只阐述调用时机。

二、调用时机:

当一个类继承了Thread类后,threadLoop方法和readyToRun方法的执行时机如下:

readyToRun方法:

readyToRun方法通常在Thread对象被启动之后,但在threadLoop方法开始执行之前被调用。
readyToRun方法用于执行一些初始化操作,准备线程执行所需的资源或环境。这个方法在子类中被重写,以便在线程开始执行之前进行必要的初始化工作。
通常,readyToRun方法会在Thread对象的run方法中被调用,在run方法中会先调用readyToRun,然后再调用threadLoop方法开始线程的主要逻辑。

threadLoop方法:

threadLoop方法是Thread类中的一个虚函数,用于定义线程的主要逻辑。子类需要继承Thread类并重写threadLoop方法,以实现线程的具体行为。
threadLoop方法定义了线程的主要执行逻辑,包括线程的循环操作,处理消息或事件等。
在Thread对象启动后,线程会执行threadLoop方法中定义的逻辑,直到线程被停止或销毁。

小结:

总的来说,readyToRun方法用于线程启动前的初始化工作,而threadLoop方法则定义了线程的主要执行逻辑。readyToRun方法在线程启动时执行,而threadLoop方法则在readyToRun方法执行完毕后开始运行,成为线程的主要执行体。

三、应用实例:

    class TimeCheckThread : public Thread {public:explicit TimeCheckThread(BootAnimation* bootAnimation);virtual ~TimeCheckThread();private:virtual status_t    readyToRun();virtual bool        threadLoop();bool                doThreadLoop();void                addTimeDirWatch();int mInotifyFd;int mSystemWd;int mTimeWd;BootAnimation* mBootAnimation;};

看到上面AOSP的一段代码,TimeCheckThread 类就继承自Thread,那么就将自己的初始化代码放到
readyToRun,然后将线程主逻辑放到threadLoop。如下:

status_t BootAnimation::TimeCheckThread::readyToRun() {mInotifyFd = inotify_init();if (mInotifyFd < 0) {SLOGE("Could not initialize inotify fd");return NO_INIT;}mSystemWd = inotify_add_watch(mInotifyFd, SYSTEM_DATA_DIR_PATH, IN_CREATE | IN_ATTRIB);if (mSystemWd < 0) {close(mInotifyFd);mInotifyFd = -1;SLOGE("Could not add watch for %s", SYSTEM_DATA_DIR_PATH);return NO_INIT;}addTimeDirWatch();if (mBootAnimation->updateIsTimeAccurate()) {close(mInotifyFd);mInotifyFd = -1;return ALREADY_EXISTS;}return NO_ERROR;
}

还有:

bool BootAnimation::TimeCheckThread::threadLoop() {bool shouldLoop = doThreadLoop() && !mBootAnimation->mTimeIsAccurate&& mBootAnimation->mClockEnabled;if (!shouldLoop) {close(mInotifyFd);mInotifyFd = -1;}return shouldLoop;
}
http://www.lryc.cn/news/493873.html

相关文章:

  • C++设计模式之构造器
  • 红日靶场-5
  • 做异端中的异端 -- Emacs裸奔之路3: 上古神键Hyper
  • Java多线程介绍及使用指南
  • HarmonyOS 5.0应用开发——列表(List)
  • 自动化电气行业的优势和劣势是什么
  • 第 42 章 - Go语言 设计模式
  • 【机器学习】---大语言模型
  • 挑战用React封装100个组件【002】
  • MarkDown-插入图片-图片url地址的生成获取方法
  • 插值、拟合和回归分析的相关知识
  • 【小白学机器学习42】进行多次抽样,样本的分布参数和总体的分布参数的关系
  • 链动星海 质引未来|中信银行加码科技金融 “接力式”服务助力“新质生产力”释放
  • 黑马2024AI+JavaWeb开发入门Day02-JS-VUE飞书作业
  • 云计算基础-期末复习
  • Java GET请求 请求参数在Body中使用Json格式传参
  • AI数据分析工具(一)
  • go结构体匿名“继承“方法冲突时继承优先顺序
  • 【049】基于51单片机语音录放【Proteus仿真+Keil程序+报告+原理图】
  • 《软件项目管理》期末-复习题及参考答案
  • milvus 通俗易懂原理
  • 什么是撞库、拖库和洗库?
  • 安卓-碎片的使用入门
  • 华为IPD流程学习之——深入解读123页华为IPD流程体系设计方法论PPT
  • DriveMLLM:一个专为自动驾驶空间理解任务设计的大规模基准数据集
  • 高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
  • python的函数与递归
  • RabbitMQ学习-Seven
  • 中科亿海微SoM模组——波控处理软硬一体解决方案
  • 开源法律、政策和实践