【Android面试】线程相关面试题分享
1·、Android中还了解哪些方便线程切换的类?
- AsyncTask:底层封装了线程池和Handler,便于执行后台任务以及在子线程中进行UI操作。
- HandlerThread:一种具有消息循环的线程,其内部可使用Handler。
- IntentService:是一种异步、会自动停止的服务,内部采用HandlerThread。
2、讲讲AsyncTask的原理
- AsyncTask中有两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),其中线程池SerialExecutor用于任务的排队,而线程池THREAD_POOL_EXECUTOR用于真正地执行任务,InternalHandler用于将执行环境从线程池切换到主线程。
- sHandler是一个静态的Handler对象,为了能够将执行环境切换到主线程,这就要求sHandler这个对象必须在主线程创建。由于静态成员会在加载类的时候进行初始化,因此这就变相要求AsyncTask的类必须在主线程中加载,否则同一个进程中的AsyncTask都将无法正常工作。
3、IntentService有什么用 ?
IntentService可用于执行后台耗时的任务,当任务执行完成后会自动停止,同时由于IntentService 是服务的原因,不同于普通Service,IntentService可自动创建子线程来执行任务,这导致它的优先级 比单纯的线程要高,不容易被系统杀死,所以IntentService比较适合执行一些高优先级的后台任务。
4、直接在Activity中创建一个thread跟在service中创建一个thread之间的区别?
- 在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务, 主动通知该Activity一些消息和事件,Activity销毁后,该Thread也没有存活的意义了。
- 在Service中被创建:这是保证最长生命周期的Thread的唯一方式,只要整个Service不退出,Thread 就可以一直在后台执行,一般在Service的onCreate()中创建,在onDestroy()中销毁。所以,在 Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中 保持与服务器端的长连接。
5、ThreadPoolExecutor的工作策略 ?
ThreadPoolExecutor执行任务时会遵循如下规则
- 如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务。
- 如果线程池中的线程数量已经达到或则超过核心线程的数量,那么任务会被插入任务队列中排队等待执行。
- 如果在第2点无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果在线程数量未 达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务。
- 如果第3点中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor 会调用RejectedExecutionHandler的rejectedExecution方法来通知调用者。
6、Handler、Thread和HandlerThread的差别?
#android面试#
- Handler:在android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消息通 讯。
- Thread:Java进程中执行运算的最小单位,亦即执行处理机调度的基本单位。某一进程中一路单独运 行的程序。
- HandlerThread:一个继承自Thread的类HandlerThread,Android中没有对Java中的Thread进行 任何封装,而是提供了一个继承自Thread的类HandlerThread类,这个类对Java的Thread做了很多便 利的封装。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在 于,它在内部直接实现了Looper的实现,这是Handler消息机制必不可少的。有了自己的looper,可 以让我们在自己的线程中分发和处理消息。如果不用HandlerThread的话,需要手动去调用 Looper.prepare()和Looper.loop()这些方法。