目录
- 什么是HandlerThread
- 实现原理
run()
getLooper()
quit()
quitSafely()
1. 什么是HandlerThread
产生背景
- 通常我们会开启 Thread 子线程进行耗时操作,但是多次创建和销毁线程是很消耗系统资源的
- 为提高性能,可以构建循环线程(在线程中创建 Looper 来进行消息轮询),当有任务到来就执行,执行完就阻塞等待下一任务而不是直接销毁
什么是HandlerThread
- HandlerThread 继承自 Thread,但内部创建了 Looper
- 通过获取 HandlerThread 的 Looper 对象传递给 Handler,可以在 handleMessage() 中执行异步任务(在调用 getLooper() 前要 start() 将线程启动)
- 与线程池注重并发不同,HandlerThread 是一个串行队列,背后只有一个线程,它不能同时进行多任务的处理,需要等待执行,效率较低(串行执行任务)
2. 实现原理
run()
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
- 创建 Looper 并执行 loop()
- notifyAll() 通知其他线程 Looper 已经创建
getLooper()
public Looper getLooper() {
if (!isAlive()) {
return null;
}
// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}
- 获取 Looper,如果此时 HandlerThread 还未启动则 wait() 等待
quit()
- 直接退出 Looper
quitSafely()
- 等待队列中所有任务完成后退出 Looper