时间:2020-11-20 17:44:00 | 栏目:JAVA代码 | 点击:次
线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法:
// 七个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
这些参数的意义如下:
ThreadPoolExecutor工作流程
流程图如下:
大致过程陈述为:
线程池中使用的阻塞队列
阻塞队列常见的方法如下表所示:
方法名 | 说明 | 注意 |
---|---|---|
add | 增加一个元索 | 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回false |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
常见四种线程池
线程池 | 使用的阻塞队列 | 线程池大小 | 超时 |
---|---|---|---|
CachedThreadPool | SynchronousQueue(队列长度无限 | 可增加,最大值Integer.MAX_VALUE | 默认60秒超时 |
FixedThreadPool | LinkedBlockingQueue(队列长度无限) | 可指定nThreads,固定数量 | 不会超时 |
newSingleThreadExecutor | LinkedBlockingQueue(队列长度无限), | 固定为1 | 不超时 |
newScheduledThreadPool | DelayedWorkQueue | 可增加,最大值Integer.MAX_VALUE | 不超时 |
它们通过Executors以静态方法的方式直接调用,实质上是它们最终调用的是ThreadPoolExecutor的构造方法,也就是本文最前面那段代码。
注:KeepAliveTime=0的话,表示不等待
《阿里巴巴java开发手册》中建议线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式,这样的处理方式让写的人员更加明确线程池的运行规则,规避资源耗尽的风险。