自定义线程池之ThreadPoolExecutor的使用

了解原因

在阿里规约里面,有这样一条规则:
在这里插入图片描述
这里提到了使用ThreadPoolExecutor来创建线程池,其实这就是我们常常听说的“自定义线程池”。该类位于java的java.util.concurrent包下。至于使用自定义的好处,上面的图片已经可以说明,接下来我们从概念到实战,分析一下这个类。

概念

ThreadPoolExecutor类间接实现了ExecutorService接口。通常经使用Executors类的工厂方法设置后,它能够从一些可能池化管理的线程里面选择一个来执行每个已经提交的任务。
ThreadPoolExecutor线程池会带来两个好处:
一、当执行大量的异步任务时,因为减少了每个任务的调用开销,线程池可以大幅度提升性能;
二、当执行一系列任务时,线程池可以提供一种绑定和管理资源、线程的方法。
每个ThreadPoolExecutor也维护一些基本的统计信息,例如已完成的任务数等。

构造参数的含义

为保证有更宽的应用场景,这个类提供了很多可调节的参数和可扩展的钩子。然而,程序员们更想用一些方便的Executors类的工厂方法(如newCachedThreadPool()、newFixedThreadPool()、newSingleThreadExecutor()等),来为大多数的普通情况做一些预设置。至于其他情形,我们使用如下的指引来手动设置和调节这个类:
在自定义线程池的最后一个构造方法中,存在的构造参数如下:在这里插入图片描述

1.尺寸参数

当通过execute方法提交一个新任务时,根据正在运行的任务数量,存在如下情形:
(1)如果正在运行的线程数小于corePoolSize(核心线程池大小),即使存在其他空闲的线程,也会创建一个新的线程来处理请求。
(2)如果正在运行的线程数大于corePoolSize(核心线程池大小),小于maximumPoolSize(最大线程池大小)时,仅在队列(等待队列)满才创建新线程来处理请求。
可以看出,corePoolSize(核心线程池大小)和maximumPoolSize(最大线程池大小)相等时,将创建一个大小固定的线程池。maximumPoolSize的最大值可以取到Integer.MAX_VALUE。通常,corePoolSize(核心线程池大小)和maximumPoolSize(最大线程池大小)在创建时就会设定尺寸,但是也可以通过setCorePoolSize()和setMaximumPoolSize()方法进行动态修改。
默认情况下,只有当任务到达时,公平的(线程不可以抢占,而是按照队列的先进先出顺序进行处理)核心线程才进行初始创建。但是也可以通过prestartCoreThread()和prestartAllCoreThreads()方法来修改这个策略。毕竟有这种可能性,你创建了一个非空等待队列的线程池,并想要在队列中的任务到达之前提前启动这些线程。

2.线程创建参数

使用ThreadFactory创建新线程。
如果只用默认的Executors的defaultThreadFactory()方法时,创建的线程都属于同一个线程组,具有同样的优先级和相同的非后台状态。
使用不同的ThreadFactory,就可以改变线程名称、线程组、优先级和后台状态等。

3.线程最大存活时间

当池中正在运行的线程数大于corePoolSize(核心线程池大小)时,超出部分的线程空闲时间大于keepAliveTime时,就会被终止。这样,当线程池使用的不太活跃时,可以减少资源消耗。如果线程池随后使用得更加活跃,就会创建新的线程。使用setKeepAliveTime()方法可以动态的设置这个数值。
默认情况下,仅当线程数多于corePoolSize时,这个超时策略才有效。但是,通过allowCoreThreadTimeOut()方法,只要把存活时间设置为非0值,也能使得这个超时策略在核心线程上生效。

4.等待队列

BlockingQueue用于传递和持有已提交的任务。这与线程池的尺寸相关:
(1)正在运行的线程数小于corePoolSize(核心线程池大小)时,执行器总是喜欢在池中创建新线程而不是让请求入队列等待;
(2)正在运行的线程数大于corePoolSize(核心线程池大小)时,执行器总是喜欢让请求入队列等待而不是在池中创建新线程;
(3)如果请求没有入列成功(可能是队列已满),如果池中线程数量小于maximumPoolSize,就会在池中创建新线程。如果池中线程数量将

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值