首页 > 其他分享 >【博学谷学习记录】超强总结,用心分享。线程池重难点知识

【博学谷学习记录】超强总结,用心分享。线程池重难点知识

时间:2022-12-04 20:14:54浏览次数:41  
标签:队列 创建 重难点 任务 线程 超强 执行 ThreadPoolExecutor

 线程池

 

1.1       为什么需要线程池 

 

在实际使用中,线程是很占用系统资源的,如果对线程管理不完善的话很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:


1、使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建销毁时造成的消耗

2、由于没有线程创建和销毁时的消耗,可以提高系统响应速度

3、通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等

 

1.2       线程池的分类

 

 

 

 


 

  1. newCachedThreadPool:创建一个可进行缓存重复利用的线程池
  2. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,线程池中的线程处于一定的量,可以很好的控制线程的并发量
  3. newSingleThreadExecutor : 创 建 一 个 使 用 单 个 worker 线 程 的 Executor ,以无界队列方式来运行该线程。线程池中最多执行一个线程,之后提交的线程将会排在队列中以此执行
  4. newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期执行
  5. newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期的执行
  6. newWorkStealingPool:创建一个带并行级别的线程池,并行级别决定了同一时刻最多有多少个线程在执行,如不传并行级别参数,将默认为当前系统的 CPU 个数

 

1.3       核心参数

 

corePoolSize:核心线程池的大小 maximumPoolSize:线程池能创建线程的最大个数 keepAliveTime:空闲线程存活时间

unit:时间单位,为 keepAliveTime 指定时间单位

 

workQueue:阻塞队列,用于保存任务的阻塞队列

 

threadFactory:创建线程的工程类

 

handler:饱和策略(拒绝策略)

 

 

1.4       线程池的原理

 

 

 

 


 
线程池的工作过程如下:

当一个任务提交至线程池之后,

  1. 线程池首先判断核心线程池里的线程是否已经满了。如果不是,则创建一个新的工作线程来执行任务。否则进入 
    1. 判断工作队列是否已经满了,倘若还没有满,将线程放入工作队列。否则进入  
    2. 判断线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行。如果线程池满了,则交给饱和策略来处理任务。

 

4.5       拒绝策略

 

ThreadPoolExecutor.AbortPolicy(系统默认): 丢弃任务并抛出 RejectedExecutionException 异常,让你感知到任务被拒绝了,我们可以根据业务逻辑选择重试或者放弃提交等策略

ThreadPoolExecutor.DiscardPolicy: 也是丢弃任务,但是不抛出异常,相对而言存在一定的风险,因为我们提交的时候根本不知道这个任务会被丢弃,可能造成数据丢失。  ThreadPoolExecutor.DiscardOldestPolicy: 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程),通常是存活时间最长的任务,它也存在一定的数据丢失风险 ThreadPoolExecutor.CallerRunsPolicy:既不抛弃任务也不抛出异常,而是将某些任务回退到调用者,让调用者去执行它。

 

4.6       线程池的关闭

 

关闭线程池,可以通过 shutdown 和 shutdownNow 两个方法原理:遍历线程池中的所有线程,然后依次中断

1、shutdownNow 首先将线程池的状态设置为 STOP,然后尝试停止所有的正在执行和未执行任务的线程,并返回等待执行任务的列表;

2、shutdown 只是将线程池的状态设置为 SHUTDOWN 状态,然后中断所有没有正在执行任务的线程

标签:队列,创建,重难点,任务,线程,超强,执行,ThreadPoolExecutor
From: https://www.cnblogs.com/linwenguan/p/16950556.html

相关文章