什么是线程池?
您常见的数据库连接池、实例池,以及XX池、OO池和各种池都是池化(pooling )思想,简单来说,它们将资源集中在一起进行管理,以实现收入最大化和风险最小化
JVA还提供了自己实现的线程池模型——ThreadPoolExecutor。 应用上面的池化想象,Java线程池会整合和管理多个线程,以最大限度地提高高并发性能,并将手动创建线程的风险降至最低
为了理解这一管理思想,我们现在只需要关注如何构建ThreadPoolExecutor,就可以在publicthreadpoolexecutor (intcorepoolsize )、
int maximumPoolSize,
长期保持活动时间,
时间单元单元,
阻塞队列工作队列,
热故障诊断,
rejectedexecutionhandlerhandler ) {
if(corepoolsize0||
最大化端口大小=0| |
最大化聚合| |
keepAliveTime 0)
thrownewillegalargumentexception (;
if (工作队列==null|=null|) ) ) ) )。
throw new NullPointerException (;
this.ACC=system.getsecuritymanager ()==null?
空:
访问控制器. get context (;
this.corePoolSize=corePoolSize;
this.maximumpoolsize=maximumpoolsize;
this.workQueue=workQueue;
this.keepalive time=unit.to nanos (keepalive time );
this.threadfactory=threadfactory;
this.handler=handler;
}
这样复杂的结构方法在JDK中并不常见,为了更形象地理解这些核心参数,我们将在很多人经历过的春运(北京——上海)中进行说明
序列号参数名称参数说明春运图像说明1corePoolSize表示常驻核心线程数,如果大于0,则本地任务完成后不会丢弃日常固定列车数。 (无论是否春运,这些列车都必须固定运行) )。
2maximumPoolSize表示线程池可以容纳可同时执行的最大线程数。 春运客流量大,临时加开、加开车辆后,总列车次数不超过这个最大值,就会出现行程不合适等问题
3keepAliveTime表示线程池中的线程空闲时间,空闲时间达到此值时线程将被丢弃,留下corePoolSize个线程位置的春运压力后暂时增车(空闲时间为keepalive tition )
4unitkeepAliveTime的时间单位最终转换为【纳秒】。 由于CPU的执行速度以keepAliveTime为单位,因此春运以【日】为计算单位
如果5workQueue请求的线程数大于maximumPoolSize,则线程进入此块列春运压力异常大,即使添加车也无法满足(maximumPoolSize )请求,所有乘车请求都将进入此块
6threadFactory顾名思义,是线程工厂,用于生产同一任务的线程组。 另外,也可以通过它增加前缀名称。 在虚拟机堆栈分析时,如(北京——上海)属于本次列车的所有前缀,表明列车的运输职责
7处理程序执行拒绝策略,如果工作队列达到上限,同时达到最大化策略,则应通过它进行处理。 例如,拒绝、废弃等。 这是一种限制流量的保护措施,因为即使工作队列排队也要达到队列最大在线,maximumPoolSize必须提出无票等拒绝策略
请考虑如果有请求就新建列车,如果请求结束就“废弃”列车,频繁重复这样的操作,这样的代价是不能接受的。
使用线程池,不仅可以手动创建线程,还可以填充无法手动创建线程的空白。 总之,线程池的作用如下:
1 )利用线程池管理和服用线程,控制最大并发行数(难以保证手动创建线程) )。
2 )实现任务线程的队列缓存策略和拒绝机制
3 )实现定时运行、周期性运行等与实践相关的一些功能(如列车指定时间运行)。
4 )隔离线程环境。 例如,如果事务服务和搜索服务位于同一服务器上,并且分别打开两个线程池,则事务线程的资源消耗将显着增加。 因此,通过配置独立的线程池,可以将较慢的事务服务和搜索服务分开,从而防止单个服务线程相互影响