JoJo的个人博客

记录精彩的程序人生

目录
线程池
/  

线程池

ThreadPoolExecutor 简介

为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。用线程时从线程池中获取,用完以后不销毁线程,而是归还给线程池。

ThreadPoolExecutor 是线程池类。

通俗的讲,它是一个存放一定数量线程的线程集合。线程池允许多个线程同时运行,同时运行的线程数量就是这个线程池的容量,也会有一部分线程出现阻塞,线程池此时也会通过响应的拒绝策略来处理。

实现Executor接口 用来执行任务,它提供了 execute()方法来执行Runnable 任务

构造参数

  • corePoolSize:核心线程数,池中所保存的线程数,包括空闲线程
  • maximumPoolSize:池中允许的最大线程数
  • keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
  • unitkeepAliveTime 参数的时间单位
  • workQueue:阻塞队列,执行前用于保持任务的队列(被提交但尚未执行的任务)。此队列仅保存由 execute 方法提交的 Runable 任务
  • threadFactory:执行程序创建新线程时使用的工厂
  • handler:拒绝策略,由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序

当任务进来时,如果核心线程数没满,创建核心核心线程并执行任务

如果核心线程满了,首选将请求加入阻塞队列,等待执行,而不添加新的线程

如果阻塞队列也满了, 就创建非核心线程执行任务

如果线程数量达到了最大线程数,则使用拒绝策略来处理任务

不同特性的线程池

1. newFixedThreadPool

只有核心线程数,任务队列无线大

返回固定数量的线程池。线程池中的数量始终不变。当有新任务提交时,线程池中若有空闲线程,则立即执行。若没有则放入任务队列中,等待有空闲线程时,处理任务队列中的任务

2. newSingleThreadPool

只有一个核心线程,任务队列无限大

返回只有一个线程的线程池。若有多余一个任务被提交,则放入任务队列中,等待有空闲线程时,按先入先出的顺序执行队列中的任务

3. newCachedThreadPool

只有非核心线程,60s空闲时间就会被回收

返回一个可根据实际情况调整线程数量的线程池。这个方法创建出来的线程池可以被无限扩展,并且当需求降低时会自动收缩。

4. newScheduledThreadPool

可以延迟执行和周期重复执行的线程池, 核心线程固定 非核心线程足够多,且闲置时会被立即回收

返回一个ScheduledExecutorService 对象,并可指定线程数量。

5. newSingleThreadScheduledExecutor

返回一个 ScheduledExecutorService 对象,线程池大小为1

ScheduledExecutorService 接口在 ExecutorService 接口之上扩展了在给定时间执行某任务的功能,在某个固定时间延迟之后,或周期性执行某个任务。

ScheduledExecutorService

ScheduledExecutorService 并不一定会立即安排执行任务,而是起到了计划任务的作用。

它主要有一下三个方法:

  1. schedule(Runnable command,long delay, TimeUnit unit)

    会在给定的时间,对任务进行一次调度

  2. scheduleAtFixedRate(Runnable command,long initialDelay, long period, TimeUnit unit)

    创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期

  3. scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

    创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟

参考文章

Java 多线程系列——线程池原理之 ThreadPoolExecutor

Java 多线程系列——线程池简介


标题:线程池
作者:SunnySky
地址:https://www.tianyang.pub/articles/2020/06/04/1591272360374.html

评论