线程池

线程状态

线程池的意义

系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线程时,频繁的创建和销毁线程对系统的资源消耗有可能大于业务处理是对系统资源的消耗,这样就有点"舍本逐末"了

针对这一种情况,为了提高性能,我们就可以采用线程池线程池可以存储多个线程

  • 线程池在启动的时,会创建大量空闲线程,当我们向线程池提交任务的时,线程池就会启动一个线程来执行该任务

  • 等待任务执行完毕以后,线程并不会死亡,而是再次返回到线程池中称为空闲状态。等待下一次任务的执行

Executors默认线程池

JDK对线程池也进行了相关的实现,在真实企业开发中我们也很少去自定义线程池,而是使用JDK中自带的线程池  

1.创建线程池:

static ExecutorService newCachedThreadPool():创建一个默认线程池

static newFixedThreadPool(int nThreads):创建一个指定最多线程数量的线程池

2.线程池操作流程

创建线程池对象

提交任务

销毁线程池

3.常用方法

execute(Runnable a)提交一个线程,无返回值

submit(Callable a)体交一个线程,有返回值(Future<T>)

自定义线程池

1.构造方法

new ThreadPoolExecutor(核心线程数量,最大线程数量,空闲线程最大存活时间,任务队列,创建线程工厂,任务的拒绝策略);

2.参数详解

  • 核心线程数是在任务不进入任务队列的情况下,可以同时进行的线程数(不会被回收)
  • 最大线程数是线程池允许创建的线程最大数量
  • 临时线程空闲时存活的时间
  • 任务队列是存放待执行任务的队列:当提交的任务数超过核心线程数大小后,再提交的任务就存放在工作队列,任务调度时再从队列中取出任务。
  • 创建线程工厂一般使用默认工厂  Executors.defaultThreadFactory()
  • 拒绝策略一般使用默认拒绝策略 new ThreadPoolExecutor.AbortPolicy()

3.线程池使用逻辑

线程池在任务数<=核心线程数时,不会创建临时线程.

线程池在任务数>核心线程数&&任务数<=核心任务数+任务队列长度时,会将任务放入任务队列,不会创建临时线程.

线程池在任务数>核心线程数&&任务数时,会创建临时线程进行任务,空闲后超过最大存活时间被销毁.

线程池在任务数>最大线程数+队列长度时,会拒绝任务,执行相应拒绝策略.

拒绝策略

AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy:丢弃任务,但是不抛出异常。可能导致无法发现系统的异常状态。
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
CallerRunsPolicy:由调用线程处理该任务。

posted on 2023-03-22 17:08  zl子路  阅读(26)  评论(0)    收藏  举报