java如何实现一个线程池?

  • 作者:三言
  • 时间:2021-02-07 22:14:33
  • 打印 举报 A+

概念

提前创建一部分线程,每个线程可以执行多个任务,这些线程组成了一个线程池,必要的时候可以动态的调整池子中的线程数。

作用

(1)降低资源消耗:创建和销毁线程都是很耗资源的,使用线程池可以复用线程减少不必要的开销。
(2)提高响应速度:创建线程是需要时间的,使用线程池复用线程快速执行任务。
(3)方便管理线程:通过线程池控制线程并发数,避免线程数过多产生频繁上下文切换,甚至将系统资源消耗殆尽。

实现方式

java中的线程池对象主要是ThreadPoolExecutor,它的类继承关系如下:

java如何实现一个线程池?


构造函数为:

java如何实现一个线程池?

结合ThreadPoolExecutor的构造函数,我们介绍一下线程池是如何实现的

corePoolSize
核心线程数量,该参数有两个含义(1)线程池初始化时的线程数量 (2)任何时候线程池中的线程数都不能少于这个值

maximumPoolSize
线程池中允许的最大线程数,线程池中的线程数量会根据任务数动态的调整,始终保持在[corePoolSize,maximumPoolSize]区间内

keepAliveTime
当线程池中的线程数>corePoolSize时,而任务数<=corePoolSize,则超出corePoolSize部分的线程在等待keepAliveTime后还没有领到任务,则自动的销毁。

workQueue
当任务数量>maximumPoolSize时,新进来的任务会进入该队列中等待执行。

RejectHandler
当workQueue满了,且还有任务进入,则根据该类定义的拒绝策略进行处理。主要包括以下几种拒绝策略:
  (1)  AbortPolicy:丢掉新来的任务,并抛出异常:RejectedExecutionException
  (2)   DiscardPolicy:丢掉新进来的任务,不抛异常
  (3)  DiscardOldestPolicy:从队列中丢掉最早进入队列中的任务,然后将新进来的任务放入队列
  (4)  CallerRunsPolicy:由主线程直接执行
  (5)   自定义

小结:
线程池中的线程数量会根据任务数量进行调整,但始终保持在[corePoolSize,maximumPoolSize]区间内;超出corePoolSize数量的线程在等待一段时间后还没有领到任务会自行销毁;如果任务数超过maximumPoolSize,则新进的任务会放入一个队列中等待调度;如果队列也满了,则会根据相应的拒绝规则进行处理新进的任务。具体流程如下(图片来自网络):

java如何实现一个线程池?


java中的几种线程池

Java中主要存在以下几种线程池:

java如何实现一个线程池?

本文标题:java如何实现一个线程池?

扩展标签:

本文地址:http://www.3yan.cn/question/1002136

声明提示:三言网为您整理了【java如何实现一个线程池?】的相关问题解答,文章内容为本站版权所有,转载请标明来路。