深入刨析线程池实现原理
2015-11-03 15:57
260 查看
1.线程池状态
2.任务的执行
任务提交给线程池之后的处理策略,这里总结一下主要有4点:
如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止(即线程池线程已达最大值,这个时候才会有keepAliveTime,就是当有线程空闲时,规定时间内之后会被销毁),直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。
3.线程池中的线程初始化
prestartCoreThread():初始化一个核心线程;
prestartAllCoreThreads():初始化所有核心线程
4.任务缓存队列及排队策略
1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;
2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。
5.任务拒绝策略
当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:
6.线程池的关闭
shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务
执行完shutdown()后是shutdown状态,即中断状态,而执行完shutdownNow后是stop状态。
7.线程池容量的动态调整
setCorePoolSize:设置核心池大小
setMaximumPoolSize:设置线程池最大能创建的线程数目大小
资料来源http://www.cnblogs.com/dolphin0520/p/3932921.html
2.任务的执行
任务提交给线程池之后的处理策略,这里总结一下主要有4点:
如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止(即线程池线程已达最大值,这个时候才会有keepAliveTime,就是当有线程空闲时,规定时间内之后会被销毁),直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。
3.线程池中的线程初始化
prestartCoreThread():初始化一个核心线程;
prestartAllCoreThreads():初始化所有核心线程
4.任务缓存队列及排队策略
1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;
2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。
5.任务拒绝策略
当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:
shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务
执行完shutdown()后是shutdown状态,即中断状态,而执行完shutdownNow后是stop状态。
7.线程池容量的动态调整
setCorePoolSize:设置核心池大小
setMaximumPoolSize:设置线程池最大能创建的线程数目大小
资料来源http://www.cnblogs.com/dolphin0520/p/3932921.html
相关文章推荐
- 如何选择合适的地图注记手段
- org.hibernate.InvalidMappingException
- Flex变态的时间控件超级麻烦
- jQuery-1.9.1源码分析系列(一)整体架构
- 5-训练与测试(重新理解机器学习的可靠性)
- iOS应用内支付(IAP)开发中后期的那些坑
- AsyncTask异步任务
- Cg shader for skybox
- Anaconda对内置包进行更新
- 经典排序算法效率研究
- linux ftp上传文件用java代码实现
- 简单的Ajax表单验证
- 安装lamp
- UNIX Tutorial Six
- kmp模板
- 执行存储过程时报“在尝试加载程序集 ID 65645 时 Microsoft .NET Framework 出错”,解决方案
- 世界十大顶级家族家训
- 设置segue跳转页面
- 三、jQuery--jQuery基础--jQuery基础课程--第11章 jQuery 工具类函数
- 元音字母A的发音规则