Java 线程池 ThreadPoolExecutor 的那些事儿
2019-09-08 09:41:25来源:博客园 阅读 ()
Java 线程池 ThreadPoolExecutor 的那些事儿
Posted on 2019-09-04 21:36 君若雅 阅读(...) 评论(...) 编辑 收藏线程池基础知识
ThreadPoolExecutor
: 一个线程池
Executors
: 线程池工厂,通过该类可以取得一个拥有特定功能的线程池
ThreadPoolExecutor
类实现了Executor
接口,因此通过这个接口,任何的Runnable
对象都可以被ThreadPoolExecutor
线程池调度。
常见的线程池类型
public static ExecutorService newFixedThreadPool(int nThreads)
返回一个固定线程数量的线程池。线程数量始终不变。当有空闲线程时,立即执行;若没有,新线程暂存在一个任务队列中,待线程空闲,便开始处理任务队列中的任务。
public static ExecutorService newSingleThreadExecutor()
返回一个只有一个线程的线程池。新线程过来存放在任务队列中,线程空闲时,处理任务队列中的任务。
public static ExecutorService newCachedThreadPool()
返回一个可以根据实际情况调整线程数量的线程池。线程的进程数不确定,但是如果有空闲线程可以复用,则会优先使用该线程。如果所有线程都在工作,又有新的任务提交,那么就会创建新的线程执行任务。所有线程在当前任务完成之后,将返回线程池进行服用。
public static ScheduledExecutorService newSingleThreadScheduldExecutor()
返回一个
ScheduledExecutorService
对象,线程池大小为1。在某个固定的延时之后执行,或者周期性执行某个任务public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
和上面一样,但是可以指定线程数。
核心线程池的内部实现
对于核心的几个线程池,其内部实现都是使用了ThreadPoolExecutor
实现。
public static ExecutorService newFixedThreaPool(int nThreads) { return new ThreadPoolExecutor(nThreads,nThreads, 0L,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); }
public static ExecutorService newSingleThreadExecutor() { return new ThreadPoolExecutor(1,1, 0L,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); }
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0,Integer.MAX_VALUE, 60L,TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
看一下ThreadPoolExecutor
最重要的构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long KeepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
函数的参数含义如下:
corePoolSize
:线程池中的线程数量。maximumPoolSize
:线程池中的最大线程数量。keepAliveTime
:当线程池数量超过corePoolSize
时,多余的空闲线程的存活时间。unit
:keepAliveTime
的单位。workQueue
:任务队列,被提交但是尚未被执行的任务。threadFactory
:线程工厂,用于创建线程,一般用默认的就行。handler
:拒绝策略。当任务太多来不及处理,如何拒绝任务。
在上面的参数中,其他的都好理解,主要是workQueue
和handler
需要重点提及一下。
workQueue
任务队列讲解
workQueue
指被提交但是尚未被执行的任务队列,它是一个BlockingQueue
接口的对象,仅用于存在Runnable
对象。根据队列功能分类,在ThreadPoolExecutor
的构造函数中可以使用以下几种BlockingQueue
:
- 直接提交的队列
SynchronousQueue
:SychronousQueue
是一个特殊的BlockingQueue
。SychronousQueue
没有容量,每一个插入操作都要等待一个相应的删除操作,反之,一个删除操作都要等待对应的插入操作。如果使用SychronousQueue
,提交的任务不会被真实的保存,而总是将新任务提交给线程执行,如果没有空闲线程,那么尝试创建新的线程,如果进程数量已经达到最大值,则执行拒绝策略。因此,使用SychronousQueue
通常要设置很大的maximumcorePoolSize
,否则很容易执行拒绝策略。 - 有界的任务队列
ArrayBlockingQueue
:特点:若有新的任务需要执行,如果线程池的实际线程小于corePoolSize
,则会优先创建新的线程;若大于corePoolSize
,则会将新任务加入到等待队列。如果等待队列已满,无法加入,则在总线成熟不大于maximumPoolSize
的前提下,创建新的线程执行任务。若大于,则执行拒绝策略。 - 无界的任务队列
LinkedBlockingQueue
:特点:若有新的任务需要执行,如果线程池的实际线程小于corePoolSize
,则会优先创建新的线程;若大于corePoolSize
,进入等待队列。 - 优先任务队列
PriorityBlockingQueue
:可以根据任务自身的优先级顺序先后执行。
handler
拒绝策略讲解
JKD
内置的拒绝策略都是通过实现RejectedExecutionHandler
接口实现的,具体如下:
AbortPolicy
策略:直接抛出异常,阻止系统正常工作;CallerRunsPolicy
策略:只要线程未关闭,直接在调用者线程中,运行当前被丢弃的任务。warning:有可能性能会急剧下降DiscardOledstPolicy
策略:丢弃一个最老的请求,并尝试再次提交当前的任务。DiscardPolicy
策略:丢弃无法处理的请求,不予任何处理,不做出任何的提示。
原文链接:https://www.cnblogs.com/psxjoy/p/11461594.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash