HandlerThread

目录

  1. 什么是HandlerThread
  2. 实现原理
    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

你可能感兴趣的:(HandlerThread)