您好,登录后才能下订单哦!
本篇内容介绍了“java中ThreadPoolExecutor知识有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法:
// 七个参数的构造函数public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
这些参数的意义如下:
corePoolSize:该线程池中核心线程数最大值 maximumPoolSize: 该线程池中线程总数最大值 keepAliveTime:该线程池中非核心线程闲置超时时长 unit:keepAliveTime的单位 workQueue:阻塞队列BlockingQueue,维护着等待执行的Runnable对象 threadFactory:创建线程的接口,需要实现他的Thread newThread(Runnable r)方法。 RejectedExecutionHandler:饱和策略,最大线程和工作队列容量且已经饱和时execute方法都将调用RejectedExecutionHandler 。
ThreadPoolExecutor工作流程
流程图如下:
大致过程陈述为:
向线程池中添加任务,当任务数量少于corePoolSize时,会自动创建thead来处理这些任务; 当添加任务数大于corePoolSize且少于maximmPoolSize时,不在创建线程,而是将这些任务放到阻塞队列中,等待被执行; 接上面2的条件,且当阻塞队列满了之后,继续创建thread,从而加速处理阻塞队列; 当添加任务大于maximmPoolSize时,根据饱和策略决定是否容许继续向线程池中添加任务,默认的饱和策略是AbortPolicy(直接丢弃)。
线程池中使用的阻塞队列
ArrayBlockingQueue:基于数组结构的有界阻塞队列,构造函数一定要传大小,FIFO(先进先出); LinkedBlockingQueue:无界,默认大小65536(Integer.MAX_VALUE),当大量请求任务时,容易造成内存耗尽。 SynchronousQueue:同步队列,是一个特殊的BlockingQueue,它没有容量(这是因为在SynchronousQueue中,插入将等待另一个线程的删除操作,反之亦然)。 DelayedWorkQueue:这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务
阻塞队列常见的方法如下表所示:
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 offer 添加一个元素并返回true 如果队列已满,则返回false poll 移除并返问队列头部的元素 如果队列为空,则返回null peek 返回队列头部的元素 如果队列为空,则返回null put 添加一个元素 如果队列满,则阻塞 take 移除并返回队列头部的元素 如果队列为空,则阻塞
常见四种线程池
newCachedThreadPool newFixedThreadPool newSingleThreadExecutor newScheduledThreadPool
CachedThreadPool SynchronousQueue(队列长度无限 可增加,最大值Integer.MAX_VALUE 默认60秒超时 FixedThreadPool LinkedBlockingQueue(队列长度无限) 可指定nThreads,固定数量 不会超时 newSingleThreadExecutor LinkedBlockingQueue(队列长度无限), 固定为1 不超时 newScheduledThreadPool DelayedWorkQueue 可增加,最大值Integer.MAX_VALUE 不超时
它们通过Executors以静态方法的方式直接调用,实质上是它们最终调用的是ThreadPoolExecutor的构造方法,也就是本文最前面那段代码。
注:KeepAliveTime=0的话,表示不等待
《阿里巴巴java开发手册》中建议线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式,这样的处理方式让写的人员更加明确线程池的运行规则,规避资源耗尽的风险。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
本文标题: java中ThreadPoolExecutor常识汇总
方法名 | 说明 | 注意 | |
---|---|---|---|
线程池 | 使用的阻塞队列 | 线程池大小 | 超时 |
“java中ThreadPoolExecutor知识有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。