Android中的线程池

65 阅读3分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:[2022首次更文挑战]

一、线程池的好处:

1.重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销。
2.能有效的控制线程池的最大并发数量,避免大量线程之间因相互抢占系统资源而导致的阻塞现象。
3.能够对线程进行简单的管理,并提供定时执行以及制定间隔循环执行等功能。
二、ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue)

ThreadPoolExecutor是线程池真正的实现。

corePoolSize 线程池核心线程数,核心线程会在线程池中一直存活,即使他们处于闲置状态。当设置allowCoreThreadTimeOut属性设置为true,那么闲置的核心线程会执行超时策略,时间由keepAliveTime决定,超出后核心线程也会被回收。

maximumPoolSize 线程池所能容纳的最大线程数,当活动线程达到最大线程后,后续的新任务将会被阻塞。

keepAliveTime 线程被回收的最大时长。
unit keepAliveTime的单位,即线程被回收的单位,毫秒,秒,分钟等。

workQueue 线程池中的任务队列,通过线程池的execute方法提交Runnable对象会存储在这个参数中。

除了上面的参数,ThreadPoolExecutor还有一个不常用的参数,Rejected-ExecutionHandler handler,由于任务队列已经满了或者无法成功执行任务,会调用handle的rejectedExecution方法来通知调用者,默认情况会直接抛出RejectExecutorException。

三、ThreadPoolExecutor 执行任务大致遵循如下规则
1.如果线程池中的数量未达到核心线程数,那么会直接启动一个核心线程执行任务。
2.如果线程中的线程数量已经达到或者超过核心线程书,那么任务会插入到任务队列中,等待执行。
3.如果任务队列已经满了,而线程数量未达到线程池最大数量,那么会立即启动一个非核心线程来执行任务。
4.如果线程数量已经达到线程池中最大值,那么就会拒绝执行次任务,会回调rejectedExecution方法来通知调用者。

四、线程池的分类
1.FixedThreadPool 它会创建固定数量的核心线程来执行任务,然后它的任务队列没有大小限制。
2.CachedThreadPool 它是创建非核型线程来执行任务,没有线程数量限制,超时时间是60s,它的任务队列无法储存元素,所有任务都是由非核心线程立即执行的。适合用于执行大量耗时较少的任务。
3.ScheduledThreadPool 它的核心线程是固定数量的,非核心线程是没有限制的。主要用于执行定时任务和具有固定周期的任务。
4.SingleThreadExecutor 只创建一个核型线程,所有的任务都在同一个线程中按照顺序执行。