网站加速 wordpress,上海网站排名推广,正规的合肥网站建设价格,招标网下载一、前言#xff1a;
在阅读AOSP代码过程中#xff0c;我们经常会看到Thread子类重写两个方法#xff1a;readyToRun和threadLoop#xff0c;不清楚的同学#xff0c;可能在这儿连调用逻辑都搞不清楚了#xff0c;因为找不到谁调用了它。我这儿先不去深究Thread内部逻辑…一、前言
在阅读AOSP代码过程中我们经常会看到Thread子类重写两个方法readyToRun和threadLoop不清楚的同学可能在这儿连调用逻辑都搞不清楚了因为找不到谁调用了它。我这儿先不去深究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;
}