java线程池的实现原理
简单使用架构分析线程池的实现原理一些重要的属性线程池的状态线程池状态间的转换workQueueworkerscorePoolSizemaximumPoolSizehandlerkeepAliveTimeallowCoreThreadTimeOutthreadFactorylargestPoolSizecompletedTaskCount构造函数提交任务执行缓存策略和排队策略任务拒绝策略线程池的关闭线程池容量的动态调整参考资料 简单使用
架构分析线程池的实现原理
线程池就是ThreadPoolExecutor类,下面也是主要介绍它的实现原理。 一些重要的属性线程池的状态
Integer.SIZE为32,所以COUNT_BITS为29。以RUNNING = -1 << COUNT_BITS举例来说,-1的补码左移位29为11100000000000000000000000000000,也就是说,线程的状态存储在int的高3位。 下面具体介绍下这几种状态:
2、SHUTDOWN:
5.TERMINATED
线程池状态间的转换
workQueue
workers
corePoolSize
具体是指:线程池中的线程数目大于这个参数时,提交的任务会被放进任务缓存队列。核心线程会一直存在,除非设置了allowCoreThreadTimeOut为true。 maximumPoolSize
handler
当提交的任务超过线程池的maximumPoolSize,那么就采用handler的方式来处理。 共有以下4种策略:
keepAliveTime
空闲线程的存活时间。如果当前的线程总量没有超过corePoolSize,就算空闲,线程也一直存在,除非设置allowCoreThreadTimeOut为true。若当前的线程总量超过corePoolSize,而且线程空闲,则经过keepAliveTime的时间,会将线程销毁。 allowCoreThreadTimeOut
当设置为true的时候,空闲的核心线程也超时。 threadFactory
largestPoolSize
completedTaskCount
构造函数
java共提供4种构造函数:
可以看到,前三种都是调用第四种来实现的,我们具体来看下第四种。 先看一下各参数代表的含义:
剩下的逻辑就是先校验参数的合法性,若合法的话,就将参数赋给成员变量。 提交任务执行
我们创建任务,然后调用线程池的submit方法来执行,那么看一下submit的逻辑。 根据参数的不同,submit提供了三种重载函数,如下:
可以看到submit的底层调用的还是execute()方法,下面再来看一下execute() 缓存策略和排队策略任务拒绝策略线程池的关闭线程池容量的动态调整参考资料
Java多线程线程池(4)--线程池的五种状态 Java - "JUC线程池" 架构 小学徒进阶系列—揭开ThreadPoolExecutor神秘的面纱 深入理解java线程池—ThreadPoolExecutor 深入理解Java之线程池 JAVA线程池原理详解一 Java线程池架构原理和源码解析(ThreadPoolExecutor) Java多线程研究05-ThreadPoolExecutor中workQueue、threadFactory和handle |
|