线程池原理和使用

# Android线程池原理和使用 > Create Time:2020/04/07 > > Author:licoba ## new Thread的缺点 - 系统执行多任务时,会为每个任务创建对应的线程,当任务执行结束之后会销毁对应的线程,在这种情况下Thread被频繁的创建和销毁,性能开销比较大。 - 如果是多个线程并发执行,抢占资源,还有可能会导致应用卡顿。 - 创建的线程任务未执行完毕,GC失败,容易造成内存泄漏 ## 线程池的优点 - 可以重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销 - 可以控制线程的最大并发数,避免因为大量的线程之间互相抢占系统资源而导致的阻塞 - 方便对线程进行管理,并提供定时执行和循环执行等功能 ## 线程池的几个关键参数 - corePoolSize:核心线程数。当一个任务进来时当前线程池中的线程个数小于核心线程数,可以直接通过ThreadFactory创建线程池;如果已经大于核心线程数时,则将任务放入到workQueue(任务队列)中。 - maximumPoolSize:线程池中可以创建的最大线程数。当线程池中的线程数等于corePoolSize并且workQueue(任务队列)已满,这时就要看当前线程数是否大于maximumPoolSize,如果小于则会创建线程去执行任务,否则会拒绝这个任务请求。 - keepAliveTime:非核心线程闲置时的超时市场,超过这个时长非核心线程就会被回收 ## 线程池的执行步骤 ![](https://pic.downk.cc/item/5e8c94d1504f4bcb044d890d.jpg) ## 线程池的分类 - `FixedThreadPool`:它是一种线程数量固定的线程池,当线程处于空闲状态时,它们并不会被回收,除非线程池被关闭,当所有的线程都处于活动状态时,新任务都会处于等待状态,直到有线程空闲出来。该线程池中只有核心线程,并且这些核心线程不会被回收,这意味着它能够更加快速的响应外界的请求。 - `CachedThreadPool`: 该线程池中线程数量不固定,并且内部只有非核心线程,其线程的最大值为 Integer.MAX_VALUE。所以可以认为该线程池中的线程数量可以任意大。该线程池的特定是当线程池中的线程都处于活动状态时,线程池会创建新的线程来处理新的任务,否则就会利用空闲的线程来处理新的任务。该线程池中的空闲线程都有超时机制,这个超时时长为 60s ,超过60s 空闲线程就会被回收。 - `ScheduledThreadPool`: 该线程池中包含核心线程以及非核心线程,核心线程数量是固定的,而非核心线程数量是没有限制的,并且当非核心线程闲置时会被立即回收。 - `SingleThreadExecutor`:该线程池是一个单例线程,其内部只有一个核心线程。