线程池的特点是将任务的提交和执行分开。这样做的好处是,能使处理器尽量多地同时执行任务。
为此,线程池提供了两个角色:
任务 task
执行任务的工人 worker
与此相关,需要考虑:
工人的数量:
工人数量的考量是线程池设计的一个关键。因此,这一点由构造线程池时,提供的头两个参数决定。
最小雇佣数量 corePoolSize
最多工人数量 maximumPoolSize
何时解雇多余最小雇佣数量的工人:
工人多余任务时,它们会等待任务的到来,如果规定时间内,还没有任务,那我们就解雇多余的工人。
这个规定的时间就是构造子里的第三,第四个参数。
能接受的任务数量:
一个工人,某一时间只能处理一个任务。工人的数量是有限的,因此多余工人数量的任务来了时:
线程池就要考虑是否接受
Y:
处于等待中的任务堆积到多少就不再允许接受任务 :
规定等待任务列表的容量[bound],达到容量后不再接受新任务。
无限制地接受等待任务[unbound]
设置何种任务等待列表由构造子的第五个参数决定。
long keepAliveTime, TimeUnit unit
N:
以何种方式拒绝:
由构造子的第七个参数决定。
第六个参数决定了
工人手里执行任务线程的工厂方法。
1.当工人数量没有达到最小雇佣数量时,每当任务来临,线程池都要创建一个工人,然后从线程工厂里创建一个新的线程,把任务作为该线程的target,把线程交给工人,把工人加入工人集合。该任务随即被执行。
2.如果任务来临时,当前工人数量poolSize已经大于最小雇佣数量,表明工人已经雇佣的差不多了,先让任务等待吧。
线程池尝试把任务加入任务列表,如果成功,任务提交的步骤就结束了。
2.5.任务列表是并发阻塞队列,工人会不断地尝试从队列里获取任务,如果获取到任务(请看5),工人就把任务拿去执行。这是任务的执行步骤。
3.如果加入队列失败,说明任务列表已经满了,不能再往里塞任务了。
这时,线程池判断工人数量是否达到最多工人数量。
如果还没有,则决定再雇佣一个工人(这和开始雇佣工人的步骤没有两样)。
4.如果已经达到雇佣上线,线程池没有办法了,只好拒绝该任务。
拒绝的方式有:
1、抛出异常给任务递送者,告诉他“老子累屁了,老子真的不干了”。 --这太粗暴了。线程池默认就这么干!
2、偷蔫儿地丢弃这个任务。 --这太猥琐了。
3、从任务列表里丢弃一个最近的任务,然后把这个任务放里。--这太势利眼了。
4、还给任务递送者,让他自己干。--这太无耻了。
5.线程池让工人等待任务的策略分两种(本文不考虑生命周期和状态):
死等!当工人数量少于或者等于最低雇佣数量时,它们没啥任务干了,就必须死等。
如果在给定时间内,没有任务来到,线程池开始数人头,如果不多于最低雇佣数量,这个工人还得重新等一个给定时间那么长。
6.否则,线程池把该工人的线程结束,告诉当前等待的工人,你没有任务了。不要再等了。
7.没有拿到任务的工人,被清除出工人集合--该工人正式下岗。
分享到:
相关推荐
一个关于java 线程池的例子,也适合android
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了...
1. RUNNING :能接受新提交的任务,并且也能处理阻塞队列中的任务 2. SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保
线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor...
JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介
线程池的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,那么超出数量的线程排队等候,等其他线程执行完毕再从队列中取出任务来执行。...
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面这篇文章主要给大家介绍了关于java线程池对象ThreadPoolExecutor的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java,线程池,ThreadPoolExecutor
主要介绍了Python线程池模块ThreadPoolExecutor用法,结合实例形式分析了Python线程池模块ThreadPoolExecutor的导入与基本使用方法,需要的朋友可以参考下
corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的...
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...
(转)线程池:java_util_ThreadPoolExecutor 比较详细的介绍了ThreadPoolExecutor用法与属性
Java线程池使用说明: 一 简介 二:线程池 三:ThreadPoolExecutor详解
主要介绍了Java线程池ThreadPoolExecutor原理及使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...
线程池ThreadPoolExecutor底层原理源码分析