💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
本章的主题是Android中的线程和线程池。**线程在Android中是一个很重要的概念,从用途上来说,线程分为主线程和子线程,主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作**。 由于Android的特性,如果在主线程中执行耗时操作那么就会导致程序无法及时地响应,因此**耗时操作必须放在子线程中去执行**。除了Thread本身以外,**在Android中可以扮演线程角色的还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程**。尽管AsyncTask、IntentService以及HandlerThread的表现形式都有别于传统的线程,但是它们的**本质仍然是传统的线程**。**对于AsyncTask来说,它的底层用到了线程池,对于IntentService和HandlerThread来说,它们的底层则直接使用了线程**。 不同形式的线程虽然都是线程,但是它们仍然具有不同的特性和使用场景。 * **AsyncTask封装了线程池和Handler,它主要是为了方便开发者在子线程中更新UI**。 * **HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler**。 * **IntentService是一个服务,系统对其进行了封装使其可以更方便地执行后台任务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出**。 从任务执行的角度来看,IntentService的作用很像一个后台线程,但是**IntentService是一种服务,它不容易被系统杀死从而可以尽量保证任务的执行**,而如果只是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会非常低,会很容易被系统杀死,这就是**IntentService的优点**。 **在操作系统中,线程是操作系统调度的最小单元**,同时**线程又是一种受限的系统资源,即线程不可能无限制地产生,并且线程的创建和销毁都会有相应的开销**。当系统中存在大量的线程时,系统会通过时间片轮转的方式调度每个线程,因此**线程不可能做到绝对的并行**,除非线程数量小于等于CPU的核心数,一般来说这是不可能的。试想一下,**如果在一个进程中频繁地创建和销毁线程,这显然不是高效的做法。正确的做法是采用线程池,一个线程池中会缓存一定数量的线程,通过线程池就可以避免因为频繁创建和销毁线程所带来的系统开销**。 *Android中的线程池来源于Java,主要是通过Executor来派生特定类型的线程池,不同种类的线程池又具有各自的特性*,详细内容会在11.3节中进行介绍。