千家信息网

线程池类ThreadPoolExecutor介绍

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(intcorePoolSize, int maximu
千家信息网最后更新 2026年11月02日线程池类ThreadPoolExecutor介绍

线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(intcorePoolSize, int maximumPoolSize,
longkeepAliveTime, TimeUnit unit, BlockingQueueworkQueue,
RejectedExecutionHandlerhandler)
corePoolSize:线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime:线程池维护线程所允许的空闲时间
unit:线程池维护线程所允许的空闲时间的单位
workQueue:线程池所使用的缓冲队列
handler:线程池对拒绝任务的处理策略
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当一个任务通过execute(Runnable)方法欲添加到线程池时:
1、如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
2、如果此时线程池中的数量等于 corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
3、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
4、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过handler所指定的策略来处理此任务。
处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样线程池可以动态的调整池中的线程数。
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS
MICROSECONDS
MILLISECONDS
SECONDS
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
1、ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
2、ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
3、ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
4、ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
例子:

import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class TestThreadPool {private static int produceTaskSleepTime = 2;private static int produceTaskMaxNumber = 10;public static void main(String[] args) {    // 构造一个线程池    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS,            new ArrayBlockingQueue(3), new ThreadPoolExecutor.DiscardOldestPolicy());    for (int i = 1; i <= produceTaskMaxNumber; i++) {        try {            // 产生一个任务,并将其加入到线程池            String task = "task@ " + i;            System.out.println("put " + task);            threadPool.execute(new ThreadPoolTask(task));            // 便于观察,等待一段时间            Thread.sleep(produceTaskSleepTime);        } catch (Exception e) {            e.printStackTrace();        }    }}}/** * 线程池执行的任务 *  */public class ThreadPoolTask implements Runnable, Serializable {    private static final long serialVersionUID = 0;    // 保存任务所需要的数据    private Object threadPoolTaskData;ThreadPoolTask(Object tasks) {    this.threadPoolTaskData = tasks;}private static int consumeTaskSleepTime = 2000;public void run() {    // 处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句    System.out.println("start .." + threadPoolTaskData);    try {        //// 便于观察,等待一段时间        Thread.sleep(consumeTaskSleepTime);    } catch (Exception e) {        e.printStackTrace();    }    threadPoolTaskData = null;}    public Object getTask() {    return this.threadPoolTaskData;    }    }

说明:
1、在这段程序中,一个任务就是一个Runnable类型的对象,也就是一个ThreadPoolTask类型的对象。
2、一般来说任务除了处理方式外,还需要处理的数据,处理的数据通过构造方法传给任务。
3、在这段程序中,main()方法相当于一个残忍的领导,他派发出许多任务,丢给一个叫 threadPool的任劳任怨的小组来做。
这个小组里面队员至少有两个,如果他们两个忙不过来,任务就被放到任务列表里面。
如果积压的任务过多,多到任务列表都装不下(超过3个)的时候,就雇佣新的队员来帮忙。但是基于成本的考虑,不能雇佣太多的队员,至多只能雇佣 4个。
如果四个队员都在忙时,再有新的任务,这个小组就处理不了了,任务就会被通过一种策略来处理,我们的处理方式是不停的派发,直到接受这个任务为止(更残忍!呵呵)。
因为队员工作是需要成本的,如果工作很闲,闲到 3 SECONDS都没有新的任务了,那么有的队员就会被解雇了,但是为了小组的正常运转,即使工作再闲,小组的队员也不能少于两个。
4、通过调整 produceTaskSleepTime和consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制,改变这两个值就可以观察不同速率下程序的工作情况。
5、通过调整4中所指的数据,再加上调整任务丢弃策略,换上其他三种策略,就可以看出不同策略下的不同处理方式。
6、对于其他的使用方法,参看jdk的帮助,很容易理解和使用。

海量视频获取

线程 任务 处理 数量 方法 队员 策略 队列 小组 时间 缓冲 两个 对象 数据 方式 空闲 类型 工作 调整 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网通讯科技 互联网科技公司电话 苏州互联网科技贷款公司 卫星互联网科技股票 字节跳动和互联网科技 北京华百购互联网科技有限公司 重庆互联网医院沙龙医盟信息科技 互联网科技和信息 亳州好赞互联网科技有限公司 燊美集互联网科技有限公司 河南住房之家互联网科技 广州新华互联网科技学校电竞方面 互联网营销推广黑科技 西安有哪些互联网高科技企业 抖集互联网科技技术咨询 互联网科技接地气 国产互联网科技公司 三亚科技创新互联网基地 东风日产互联网科技公司叫什么 山东亿川互联网科技有限责任公司 瑰夏咖啡 重生之互联网科技帝国 互联网金融 金融科技 互联网科技公司官网 互联网教育科技公司vipkid 互联网公司科技股 赶超互联网科技 微信多开 乌鲁木齐新华智原互联网科技学校 卡尔迅互联网科技有限公司 互联网科技自媒体灵感
0