一、前言:
在阅读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;
}