详解Java线程池

2022-05-12 10:55:23 浏览数 (1)

文章目录
  • 一、简介
  • 二、线程池的优势
  • 三、线程池的主要参数
  • 四、线程池流程
  • 五、四种线程池

一、简介

   线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

二、线程池的优势

(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, 优先级)执行。(优点是一个任务一个任务执行,保证顺序性。缺点是前一个任务的延迟或异常都将会影响到之后的任务)

0 人点赞