线程池作用及基本原理(简略)
Posted 知梦浮生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池作用及基本原理(简略)相关的知识,希望对你有一定的参考价值。
作用
重复管理线程,避免创建大量的线程增加开销。在降低开销的同时,运用得当也可以提高响应速度。
基本原理
谈到线程池的原理,涉及到的内容点有点多,分别从下述几点阐述:
ThreadPoolExecutor四大默认构造函数
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue
workQueue) ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue
workQueue, ThreadFactory threadFactory) ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue
workQueue, RejectedExecutionHandler handler) ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue
workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 空闲线程存活时间
unit keepAliveTime的时间单位
TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //纳秒
workQueue 一个阻塞队列,用来存储等待执行的任务
threadFactory 线程工厂,主要用来创建线程
handler 表示当拒绝处理任务时的策略
任务阻塞队列
当线程池中核心线程数已满时,后续的任务将会保存到队列中
线程池队列实现BlockingQueue接口,常用有如下几种:
每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态
吞吐量通常要高于 LinkedBlockingQueue
Executors.newCachedThreadPool使用了这个队列
吞吐量通常要高于ArrayBlockingQueue
Executors.newFixedThreadPool() 使用了这个队列
ArrayBlockingQueue:基于数组、有界,按 FIFO(先进先出)原则对元素进行排序
有界队列方式,特点:
1.当线程线程任务数未达到核心线程数时,任务不入队列,直接创建线程运行
2.达到核心数时,新任务线程先入队列,如果队列满了,则直接创建创建线程运行,但总线程数必须小于最大线程数
3.如果队列满了,又达到最大线程数了,后续任务会异常抛出,不被接受
LinkedBlockingQueue:基于链表,按FIFO (先进先出) 排序元素
无界队列方式(默认大小为Integer.MAX_VALUE),特点:
1.当线程线程任务数未达到核心线程数时,任务不入队列,直接创建线程运行
2.达到核心数时,新任务直接入队列,队列在内存满足情况下无限
SynchronousQueue:不存储元素的阻塞队列
直接提交方式,特点:
1.当线程任务数未达到核心数时,直接创建新城运行
2.达到核心数时,队列可运行存入1个线程任务,后续的会继续直接创建线程运行
PriorityBlockingQueue:具有优先级的、无限阻塞队列(基本不使用)
拒绝策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecuti onException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
线程池默认使用AbortPolicy策略,也可自行实现RejectedExe cutionHandler 接口自定义策略
线程池状态
RUNNING 运行态,可处理新任务并执行队列中的任务
SHUTDOW 关闭态,不接受新任务,但处理队列中的任务
STOP 停止态,不接受新任务,不处理队列中任务,且打断运行中任务
TIDYING 整理态,所有任务已经结束,workerCount = 0 ,将执行terminated()方法
TERMINATED 结束态,terminated() 方法已完成
以上是关于线程池作用及基本原理(简略)的主要内容,如果未能解决你的问题,请参考以下文章
Java技术指南「并发编程专题」Fork/Join框架基本使用和原理探究(原理及源码篇)