线程池的执行原则及配置参数详解
池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能。Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生成线程池,通过 Executors 可以方便的生成不同类型的线程池。但是要更好的理解使用线程池,就需要了解线程池的配置参数意义以及线程池的具体工作机制。
下面先介绍一下线程池的好处以及创建方式,接着会着重介绍关于线程池的执行原则以及构造方法的参数详解。
线程池的好处
引用自 并发编程网 - ifeve.com 的说明:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
创建线程池
//参数初始化
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
//核心线程数量大小
private static final int corePoolSize = Math.max(2, Math.min(CPU_COUNT - 1, 4));
//线程池最大容纳线程数
private static final int maximumPoolSize = CPU_COUNT * 2 + 1;
//线程空闲后的存活时长
private static final int keepAliveTime = 30;//任务过多后,存储任务的一个阻塞队列
BlockingQueue<Runnable> workQueue = new SynchronousQueue<>();//线程的创建工厂
ThreadFactory threadFactory = new ThreadFactory() {private final AtomicInteger mCount = new AtomicInteger(1);public Thread newThread(Runnable r) {return new Thread(r, "AdvacnedAsyncTask #" + mCount.getAndIncrement());}
};//线程池任务满载后采取的任务拒绝策略
RejectedExecutionHandler rejectHandler = new ThreadPoolExecutor.DiscardOldestPolicy();//线程池对象,创建线程
ThreadPoolExecutor mExecute = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime,TimeUnit.SECONDS,workQueue,threadFactory, rejectHandler
);
具体参数介绍
corePoolSize
线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的情况下,核心线程会在线程池中一直存活,即使处于闲置状态。
maximumPoolSize
线程池所能容纳的最大线程数。当活动线程(核心线程+非核心线程)达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。
keepAliveTime
非核心线程闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池通过 allowCoreThreadTimeOut() 方法设置 allowCoreThreadTimeOut 属性为 true,则该时长同样会作用于核心线程,AsyncTask 配置的线程池就是这样设置的。
unit
keepAliveTime 时长对应的单位。
workQueue
线程池中的任务队列,通过线程池的 execute() 方法提交的 Runnable 对象会存储在该队列中。
ThreadFactory
线程工厂,功能很简单,就是为线程池提供创建新线程的功能。这是一个接口,可以通过自定义,做一些自定义线程名的操作。
RejectedExecutionHandler
当任务无法被执行时(超过线程最大容量 maximum 并且 workQueue 已经被排满了)的处理策略,这里有四种任务拒绝类型。
线程池工作原则
1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。
2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中,随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从workQueue 中取任务并处理。
3 、当 taskQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。
4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。
任务队列 BlockingQueue
任务队列 workQueue 是用于存放不能被及时处理掉的任务的一个队列,它是一个 BlockingQueue 类型。
关于 BlockingQueue,虽然它是 Queue 的子接口,但是它的主要作用并不是容器,而是作为线程同步的工具,他有一个特征,当生产者试图向 BlockingQueue 放入(put)元素,如果队列已满,则该线程被阻塞;当消费者试图从 BlockingQueue 取出(take)元素,如果队列已空,则该线程被阻塞。(From 疯狂Java讲义)
任务拒绝类型
ThreadPoolExecutor.AbortPolicy:
当线程池中的数量等于最大线程数时抛 java.util.concurrent.RejectedExecutionException 异常,涉及到该异常的任务也不会被执行,线程池默认的拒绝策略就是该策略。
ThreadPoolExecutor.DiscardPolicy():
当线程池中的数量等于最大线程数时,默默丢弃不能执行的新加任务,不报任何异常。
ThreadPoolExecutor.CallerRunsPolicy():
当线程池中的数量等于最大线程数时,重试添加当前的任务;它会自动重复调用execute()方法。
ThreadPoolExecutor.DiscardOldestPolicy():
当线程池中的数量等于最大线程数时,抛弃线程池中工作队列头部的任务(即等待时间最久的任务),并执行新传入的任务。
参考
聊聊并发(三)Java线程池的分析和使用
Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用示例
多线程 线程池ThreadPoolExecutor介绍
线程池的执行原则及配置参数详解相关推荐
- elastic-Job配置参数详解
elastic-Job配置参数详解 1. 注册中心配置 (1) reg:zookeeper命名空间属性说明 属性名 类型 是否必填 缺省值 描述 id String 是 注册中心在Spring容器 ...
- Spring Boot笔记—多线程系列(三)—配置参数详解
前言 前两篇文章,我们已经学会了如何使用spring boot的多线程和自定义线程池.这篇文章,我们要深入了解上一篇文章中线程池的配置具体含义. 准备工作 说明 为了方便观察线程的情况(如执行完毕数量 ...
- Ceph优化系列(二):Ceph主要配置参数详解
转载:Ceph配置参数详解 概述 Ceph的配置参数很多,从网上也能搜索到一大批的调优参数,但这些参数为什么这么设置?设置为这样是否合理?解释的并不多 本文从当前我们的ceph.conf文件入手,解释 ...
- Equinox OSGi系列之三 Equinox配置参数详解
1.概述 上文我们对Equinox OSGi运行环境的组成及搭建过程做了详细讲述.本文主要对Equinox OSGi运行环境的可配置参数及其作用加以介绍,从而使用户在实际使用过程中可以对Equinox ...
- Ehcache配置参数详解
ehcache配置参数详解 <?xml version="1.0" encoding="UTF-8"?><ehcache><dis ...
- RocketMQ-PushConsumer配置参数详解
基于RocketMQ 4.3,PushConsumer配置参数详解 1.Push消费模式下的配置 Push 默认使用的是DefaultMQPushConsumer. 2.consumerGroup C ...
- ELK详解(二十五)——elastalert配置参数详解
今天继续给大家介绍Linux运维相关知识,本文主要内容是elastalert的配置参数详解. 一.配置文件参数详解 首先,我们来讲解一下elastalert的配置文件中的常用参数: 1.ES集群相关参 ...
- python线程池(threadpool)模块使用笔记详解
这篇文章主要介绍了python线程池(threadpool)模块使用笔记详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在做一个视频设备管理的项目,设备包括(摄像 ...
- Rsync配置参数详解-什么是Rsync
1.什么是Rsync-Rsync配置参数详解 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的"R ...
最新文章
- linux tomcat下部署多个项目启动失败
- MapReduce基础开发之三字段处理并输出Hive表
- 201571030316/201571030314 《小学四则运算练习软件需求说明》结对项目报告
- ios 动态化视图_如何在iOS应用中使高度收集视图动态化
- 解决 Tomcat 添加 Cookie 域名报错问题 : CookieProcessor
- pycharm Debug调试
- CSS链接四种状态注意顺序、UI伪类选择器的顺序
- rdlc报表 矩形高固定_固定资产管理系统_简化资产管理流程
- 小白学习vuex的超级全面版本
- AI如何变革家居软装?拍图就能搜商品,深度学习平台飞桨新玩法
- 如何解决“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”
- 基于WebGIS的车联网平台的研究与应用
- mappedBy的具体使用及其含义
- avr+开发环境+linux,菜鸟的avr-gcc for linux 安装过程
- Android在一个app中启动其他app中的service或者Activity
- 电话用户部分(TUP)
- Libra最大的竞争对手是什么?Calibra高管给出答案
- 复制链接到safari浏览器打开_3种方法导入书签到Safari浏览器
- win7临时文件_Win7系统电脑当中的temp文件是如何清理的?
- git 新入职员工流程
热门文章
- 鸟叔linux命令大全,[鸟哥linux视频教程整理]02_01_linux操作系统及常用命令
- luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
- python和jupyter安装
- ASP.NET MVC多语言 仿微软网站效果(转)
- npm 报错 Module build failed: Error: No PostCSS Config found in:
- 1,通过代码自定义cell(cell的高度不一致)的基本步骤
- Tcl8.6原生支持oop了
- java蓝桥杯算法训练完数
- python3集合_Python3 集合
- linux内核--设备驱动程序(学习笔记)