学习高性能服务系统:线程池

关于线程池为什么需要线程池?
线程是处理器调度的基本单位。我们会为每一个请求都独立创建一个线程,而操作系统创建线程、切换线程状态、结束线程都要使用CPU进行调度。

线程池的实现:
ScheduledThreadPoolExecutor
ThreadPoolExecutor
ForkJoin Pool

线程池的逻辑结构
在这里插入图片描述

创建线程池的构造函数

public ThreadPoolExecutor(
      int corePoolSize,       #核心线程数
      int maxinmumPoolSize,   #线程总数  非核心数=总数-核心数
      long keepAliveTime,     #当前线程数大于核心线程数时  线程的等待新任务的等待时间(核心线程也会面临死亡)
      TimeUnit unit,          #时间单位
      BlockingQueue<Runnable> workQueue #任务队列
       
      RejectedExecutionHandler #(选填) 拒绝处理器
)

poolExecutor 线程池对象
submit(任务)   execute(任务)  将任务送入到任务队列    任务对象要实现Runnable接口或者Callable接口
核心:
当前运行线程数 小于corePoolSize 任务直接交给核心线程进行执行(通过线程调度执行任务)
当前运行线程数 大于或等于 corePoolSize 任务且满足队列规则 任务将进入任务队列进行等待
当前运行线程数 大于或等于 corePoolSize 任务且不满足队列规则  任务进入非核心线程(这类线程有存活时间,不一定会执行成功)


任务队列(实现BlockingQueue接口)
SyschronousQueue:每一次add()插入 必须要等待相对删除/读取操作
ArrayBlockingQueue:数组的方式,大小创建后不能改变大小,具有阻塞特性。
LinkedBlockingQueue:无限容量 基于链表的形式
LinkedBlockingDeque :无限双端链表队列,可以从两头进行元素的读/取操作
PriorityBlockingQueue:按照优先级进行内部元素排序的无限队列。
LinkedTransferQueue:无限队列,先进先出,具有阻塞特性。
#阻塞特性:当队列满了,便会阻塞等待,直到有元素出队,后续的元素才可以被加入队列。


关于拒绝处理器
适用:那些既不能进入核心线程、等待队列,也无法创建新的线程执行(即非核心线程),或者线程异常等。

CallerRunsPolicy:直接运行该任务的run方法,但不是在线程池内部
AbortPolicy:RejectedExecutionException异常抛出(默认)
DiscardPolicy:不会做任何处理
DiscardOldestPolicy:检查等待队列 强行取出队列头部任务 进行执行

猜你喜欢

转载自blog.csdn.net/weixin_40990818/article/details/86374013