文章目录- 一、简介
- 二、线程池的优势
- 三、线程池的主要参数
- 四、线程池流程
- 五、四种线程池
一、简介
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
二、线程池的优势
(1)降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗; (2)提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行; (3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。使用线程池可以进行统一的分配,调优和监控。 (4)提供更强大的功能,延时定时线程池。
三、线程池的主要参数
代码语言:javascript复制public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
参数 | 释义 |
---|---|
corePoolSize | 线程池中的常驻核心线程数。当有请求任务来之后,若线程池已创建的线程数小于corePoolSize,会通过创建一个新线程来执行该任务。当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。 |
maximumPoolSize | 线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。 |
keepAliveTime | 空闲线程的存活时间。当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。 |
unit | keepAIiveTime的单位。 |
workQueue | 任务队列。用于传输和保存等待执行任务的阻塞队列 |
threadFactory | 线程工厂。用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号) |
handler | 线程饱和策略。当线程池和队列都满了,再加入线程会执行此策略。 |
拒绝策略: | |
策略 | 释义 |
:– | :– |
CallerRunsPolicy | 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大。 |
AbortPolicy | 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。 |
DiscardPolicy | 直接丢弃,其他啥都没有。 |
DiscardOldestPolicy | 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入。 |
四、线程池流程
判断线程池中当前线程数是否大于核心线程数,如果小于,在创建一个新的线程来执行任务,如果大于则判断任务队列是否已满,没满则将新提交的任务添加在工作队列,已满则判断线程池中当前线程数是否大于最大线程数,如果小于,则创建一个新的线程来执行任务,如果大于,则执行饱和策略。
五、四种线程池
线程池 | 释义 |
---|---|
newFixedThreadPool | 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。(优点是适合长期任务,性能好。缺点是不会复用线程,每运行一个Runnable都会通过ThreadFactory创建一个线程) |
newScheduledThreadPool | 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。 |
newCachedThreadPoo | 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。(优点是适合短期异步任务或者负载很轻的服务。缺点是可以无限的新建线程,容易造成堆外内存溢出。) |
newSingleThreadExecutor | 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。(优点是一个任务一个任务执行,保证顺序性。缺点是前一个任务的延迟或异常都将会影响到之后的任务) |