JDK8线程池-ThreadPoolExecutor动态调整corePoolSize与maximumPoolSize

Java ThreadPoolExecutor核心参数详解与生产级配置 ThreadPoolExecutor是Java并发编程中实现异步任务调度的核心组件,其本质是一套基于线程生命周期、任务队列策略与拒绝机制的动态资源调控系统。理解corePoolSize与maximumPoolSize的协同关系、keepAliveTime对临时线程的实际作用范围、workQueue(如ArrayBlockingQueue/SynchronousQueue)对吞吐与稳定性的影响,以及handler(如CallerRunsPolicy)在流量洪峰下的自我保护价值,直接决定服务的SLA保障能力。这 阅读详情

前言

线程池ThreadPoolExecutor在运行的过程中,业务并发量变动,需要不停服务调整线程池的线程数,ThreadPoolExecutor支持动态调整corePoolSize与maximumPoolSize的值。

1. 示例demo

public class ThreadChangeTest {
    public static void main(String[] args) throws InterruptedException {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(3,
                10,
                10l, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(10));

        int count = 0;
        while (true) {
            Thread.sleep(1000l);
            for (int i = 0; i < 9; i++) {
                executor.execute(() -> {
                    /*try {
                        Thread.sleep(1l);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }*/
                    System.out.println("------------core:\t" + executor.getCorePoolSize() + "\tactive:\t" + executor.getActiveCount() + "\tmax:\t" + executor.getMaximumPoolSize());
                });
            }

            count++;
            if (count == 20) {
                executor.setCorePoolSize(2);
                executor.setMaximumPoolSize(9);
                System.out.println("----------------------------------------");
            }

            if (count == 100) {
                executor.shutdown();
                System.out.println("=============================================");
                break;
            }
        }

        Thread.currentThread().join();
    }
}

在程序运行中动态修改线程池corePoolSize与maximumPoolSize的值

2. 源码分析

2.1 线程池参数调大

    public void setCorePoolSize(int corePoolSize) {
        if (corePoolSize < 0)
            throw new IllegalArgumentException();
        int delta = corePoolSize - this.corePoolSize;
        this.corePoolSize = corePoolSize;
        //核心线程调小,中断空闲任务,否则线程池的当前任务结束,自动调小
        if (workerCountOf(ctl.get()) > corePoolSize)
            interruptIdleWorkers();
        //核心线程数调大后,从队列取任务
        else if (delta > 0) {
            // We don't really know how many new threads are "needed".
            // As a heuristic, prestart enough new workers (up to new
            // core size) to handle the current number of tasks in
            // queue, but stop if queue becomes empty while doing so.
            //队列大小是否可以取任务
            int k = Math.min(delta, workQueue.size());
            //队列有任务就取,否则break
            while (k-- > 0 && addWorker(null, true)) {
                if (workQueue.isEmpty())
                    break;
            }
        }
    }

    public void setMaximumPoolSize(int maximumPoolSize) {
        if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
            throw new IllegalArgumentException();
        this.maximumPoolSize = maximumPoolSize;
        //中断空闲任务,否则线程池的当前任务结束,自动调小
        if (workerCountOf(ctl.get()) > maximumPoolSize)
            interruptIdleWorkers();
    }

源码看出:线程池的调节时直接设置corePoolSize与maximumPoolSize的值

其中

workerCountOf(ctl.get())

代表工作任务线程数,参考我的博客JDK8线程池-ThreadPoolExecutor源码解析

调大corePoolSize与maximumPoolSize,线程池运行过程中自动生效,线程池处理逻辑增强。

2.2 线程池调小

调小corePoolSize与maximumPoolSize均会执行

interruptIdleWorkers();

2.2.1 跟踪interruptIdleWorkers源码

    private void interruptIdleWorkers() {
        interruptIdleWorkers(false);
    }

    private void interruptIdleWorkers(boolean onlyOne) {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            //workers是所有已存在的线程,包括空闲线程
            for (Worker w : workers) {
                Thread t = w.thread;
                //这里注意,非常关键,加锁w.tryLock()
                if (!t.isInterrupted() && w.tryLock()) {
                    try {
                        t.interrupt();
                    } catch (SecurityException ignore) {
                    } finally {
                        w.unlock();
                    }
                }
                //从上面的参数onlyOne is false
                if (onlyOne)
                    break;
            }
        } finally {
            mainLock.unlock();
        }
    }

 这里的workers注意:是一个HashSet,存放规则:

核心线程优先占满,即使核心线程有空闲,新任务来了会优先开启新的线程而不是复用,核心线程仅在占满才会复用,然后使用队列,最后使用max线程,max线程数对应的workers会动态变化,

参考我的博客JDK8线程池-ThreadPoolExecutor源码解析

2.2.2 线程池任务执行源码

我们看ThreadPoolExecutor执行任务的源码,参考我的博客JDK8线程池-ThreadPoolExecutor源码解析

final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            while (task != null || (task = getTask()) != null) {
                //这里注意,加锁了,非常关键
                w.lock();
                // If pool is stopping, ensure thread is interrupted;
                // if not, ensure thread is not interrupted.  This
                // requires a recheck in second case to deal with
                // shutdownNow race while clearing interrupt
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        //任务执行
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }

 可以看出在任务拿出来后,立即加锁

包括任务执行的过程都是加锁的。

2.2.3 加锁分析

private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
    {

    Worker(Runnable firstTask) {
        setState(-1); // inhibit interrupts until runWorker
        this.firstTask = firstTask;
        this.thread = getThreadFactory().newThread(this);
    }

    /** Delegates main run loop to outer runWorker  */
    public void run() {
        runWorker(this);
    }
    protected boolean tryAcquire(int unused) {
        if (compareAndSetState(0, 1)) {
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }
    protected boolean tryRelease(int unused) {
        setExclusiveOwnerThread(null);
        setState(0);
        return true;
    }

    public void lock()        { acquire(1); }
    public boolean tryLock()  { return tryAcquire(1); }
    public void unlock()      { release(1); }
    public boolean isLocked() { return isHeldExclusively(); }

使用了AQS,自定义了加锁方式CAS模式

public abstract class AbstractQueuedSynchronizer
    extends AbstractOwnableSynchronizer
    implements java.io.Serializable {

    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

    public final boolean release(int arg) {
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);
            return true;
        }
        return false;
    }

 可以看出使用tryAcquire和tryRelease,均重写方法

    protected boolean tryAcquire(int unused) {
        if (compareAndSetState(0, 1)) {
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }

compareAndSetState(0, 1)

使用上面的代码加锁,意味着线程执行过程中都是加锁的,不会被销毁,只会销毁空闲线程,或者当前线程执行结束销毁。

线程池调小corePoolSize与maximumPoolSize对当前正在执行的任务没有影响。

2.3 调节队列大小

队列是不可以动态调整的。

private final int capacity;

3. 总结

1)线程池corePoolSize与maximumPoolSize调大注意max线程数不要调过大,计算机资源是有限的。

2)线程池的队列初始化大小注意,不能动态调节,队列占用的是堆内存,注意JVM的内存大小与GC能力,尽量减小大对象的存在。

3)线程池corePoolSize与maximumPoolSize和队列调小注意,线程池的处理能力减弱,可能会执行拒绝策略。

Java ThreadPoolExecutor七参数深度解析与生产调优 线程池是Java并发编程的核心基础设施,其底层实现ThreadPoolExecutor的7个构造参数直接决定系统稳定性与性能边界。理解corePoolSize与maximumPoolSize的数学建模逻辑、workQueue的有界性对背压控制的关键作用、以及RejectedExecutionHandler在不同业务场景下的容错语义,是构建高可用服务的基础能力。尤其在高并发、IO密集型系统中,盲目使用Executors工厂方法极易引发OOM或线程耗尽等线上故障。本文结合CPU/IO密集型任务公式、队列容量科学 阅读详情

相关推荐

Tushare Pro的安装使用——“抱歉,您没有访问该接口的权限,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108”问题

最近做毕设关于量化交易的, 因此一直使用tushare作数据源,但是过程中到一些问题,因此这里写篇文章,供大家一起交流下。 Tushare简介 Tushare是一个免费、开源的python财经数据接口包。拥有如股票、基金、期货等行情数据,公司财务、基金经理等基本面数据,以及债券、外汇、行业、大数据、区块链。Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,因此非常方便...

sinat_40875078的博客 1万+

java线程池学习

1.传统方式创建线程池的弊端 1.传统方式通过ExecutorService executorService = Executors.newCachedThreadPool() 创建线程池 虽然简化了开发人员的创建流程 但是由于这种方式隐藏了线程池内部的原理 在线上可能存在很大的风险 故需要手动创建线程池(默认的方式 线程池采用队列没有指定大小 采用无界队列Integer.MAX 在高并发环境下 容易导致服务器资源枯竭) 2.推荐创建方式 /** * 方式1 阿里推荐方式 ...

mclongyi的专栏 677

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3596

java多线程进阶(十)线程池

本文详细阐述了线程池的作用与对应源码的实现方式

jiayibingdong的博客 1239

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1234

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1345

java ThreadPoolExecutor构造函数各个参数的意义,以及推荐值

corePoolSize:指定线程池的核心线程数,即线程池中能同时执行的最大线程数。默认情况下,线程池不会立即创建核心线程,而是在有任务提交时才创建,但如果调用 prestartCoreThread 方法,线程池则会在开始执行任务之前立即创建所有核心线程。maximumPoolSize:指定线程池的最大线程数,即线程池中最多能创建的线程数。当任务队列满时,线程池会继续创建新的线程,直到线程数达到了 maximumPoolSize,此时无法再创建新的线程。threadFactory:指定创建线程的工厂类。

伊之仲的博客 455

uniapp - 解决报错 canvasToTempFilePath: fail canvas is empty 画布为空错误,生成海报相册、二维码、条码、裁剪/拼合操作图片报错,加了this还是报错

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,canvasToTempFilePath:失败画布为空,报错,canvasToTempFilePath:failcanvasisempty,不支持2d,还是报错,this,加上this还是报错,vue3没有this怎么办?海报,保存到手机相册,生成二维码,显示条码,图像裁切,图片处理,canvas报错,无法解决,还是fail,依然报错,传了this也不好使,Uniapp小程序,如何解决这个问题

🏆 前端领域优质创作者 4706

Java 线程池及参数动态调节详解

前前言:本文搬自头条作者:why技术 前言:曾经自诩对线程池了如指掌,不料看了美团的一篇技术文章后才知道原来线程池的参数还可以动态调节。 经典面试题 在这篇文章中我主要回答上面抛出的这个问题:你这几个参数的值怎么来的呀? 要回答这个问题,我们得先说说这几个参数是什么,请看截图: 其实,官方的注释写的都非常明白了。你看文章的时一定要结合英文,因为英文是 Doug Lea(...

liu_ares的博客 8375

RK3588 部署 ArcFace(r100)人脸识别模型:ONNX 转 RKNN 全流程详解

本文介绍了将ArcFace人脸识别模型转换为RKNN格式并部署到RK3588 NPU的方法。ArcFace是主流的人脸特征提取模型,适用于1:1比对和1:N检索等场景。文章详细说明了模型特点(输入112x112 RGB图像,输出512维特征向量)及转换步骤:首先使用torch2onnx将PyTorch模型转为ONNX格式,再通过RKNN工具进行量化转换。提供了完整的Python转换代码,包括预处理配置、模型加载、构建和导出过程。该方法能有效提升边缘设备上的人脸识别实时性,适用于门禁、考勤等应用场景。

J。 415

大疆司空 2 私有化部署:FH2、Terra、4G 三大服务区别详解

摘要: 司空2私有版包含三大模块:FH2(核心平台,必选)、Terra(建模算力,需NVIDIA显卡)、4G(内网图传)。FH2是基础,支持设备管理与任务调度;Terra适用于测绘建模场景,依赖GPU算力;4G模块保障复杂环境下的图传稳定性,适合纯内网部署。选择逻辑:先部署FH2,再按需添加Terra(需显卡)或4G(需内网支持),避免资源浪费。

2501_93651177的博客 576

java中四种线程池及poolSize、corePoolSize、maximumPoolSize

Executors提供四种线程池: newCachedThreadPool :缓存线程池,如果线程池长度超过处理需要,可回收空闲线程,若无可回收,则新建线程。newFixedThreadPool : 定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool : 计划线程池,支持定时及周期性任务执行。newSingleThreadExecutor...

公众号:BennuCTech 4万+

无限泛化!AI背景文字识别,腾讯文字六宫格

本文介绍了生成大规模文字验证码数据集的方法,通过使用上百种字体和2万+字库,结合随机背景和数十种图像增强技术,生成了2000万+的多样化样本。该方法采用二阶段训练策略,确保模型对字体、形态、形变等具有强泛化能力,可适配腾讯、咸鱼等多种平台的文字验证码识别,包括生僻字和复杂形变情况。生成的模型在多种验证码场景下表现优异,但强调该方法仅用于技术研究,严禁非法用途。

码王吴彦祖的博客 561

Day8 Java线程池终极指南:7个参数你真的理解了吗

今天这篇,我把线程池的7个参数逐个拆解,给你原理图、场景模拟、动态调整方案。看完这篇,你配置线程池不再靠猜。

雨1986的博客 491

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

线程池参数精讲与动态调整实战:从原理到生产级调优

本文深入探讨了Java线程池的核心参数配置与动态调整机制。文章首先剖析了线程池七大参数(核心线程数、最大线程数、空闲存活时间、工作队列等)的作用原理和设置原则,通过Mermaid流程图直观展示了线程池的工作流程。针对生产环境中的动态调整需求,详细介绍了JDK原生setter方法的使用限制,并提出了两种队列容量调整方案:自定义可调整队列和线程池重建策略。文中还穿插了多个实际案例,如CPU密集型任务配置不当、无界队列导致OOM等典型问题,为开发人员提供了全面的线程池调优方法论和实践指导。

m0_46633338的博客 676

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ThreadPoolExecutor 相关知识总结

ThreadPoolExecutor 参数详解、正确使用方法、运行原理总结

woniu_buhui_fei的博客 406

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java线程池ThreadPoolExecutor核心参数详解与生产环境配置实战

线程池是多线程编程中的核心概念,它通过复用线程资源来避免频繁创建和销毁线程带来的性能开销,从而提升系统吞吐量和响应速度。其工作原理基于生产者-消费者模型,通过维护一个工作线程队列和一个任务队列,实现任务的调度与执行。这项技术的核心价值在于优化资源管理、提高系统稳定性,并有效应对高并发场景。在实际应用中,线程池广泛用于Web服务器请求处理、异步任务执行、批量数据处理等。本文聚焦于Java中的ThreadPoolExecutor,深入剖析其七大核心参数——包括核心线程数、任务队列及拒绝策略等——的配置逻辑与最佳

weixin_30535843的博客 498

线程池原理(JDK1.8)

线程池原理(JDK1.8) 2018-08-06 16:30:37食鱼酱阅读数 318更多 Java中的线程池 ThreadPoolExecutor是线程池类。对于线程池,可以通俗的将它理解为”存放一定数量线程的一个线程集合。线程池允许若个线程同时允许,允许同时运行的线程数量就是线程池的容量;当添加的到线程池中的线程超过它的容量时,会有一部分线程阻塞等待。线程池会通过相应的调度策略和拒绝...

cxu123321的博客 156

Java线程池核心参数详解与生产环境配置实战

线程池是并发编程中的核心组件,其本质是通过复用线程资源来提升系统性能与稳定性。从原理上看,它通过维护一个线程队列和任务队列,实现了对线程生命周期的统一管理,避免了频繁创建销毁线程的开销。这一技术价值在于能够有效控制并发度、降低资源消耗,并提升系统吞吐量。在实际应用场景中,无论是Web服务器处理高并发请求,还是后台执行批量数据处理任务,合理配置的线程池都是保障服务稳定性的关键。本文聚焦于Java中ThreadPoolExecutor的深度解析,特别是其核心参数如corePoolSize、maximumPool

weixin_30617695的博客 412

Java线程池核心原理、参数配置与生产环境实战指南

线程池是一种基于池化思想管理线程资源的并发编程模型,其核心原理在于复用已创建的线程,避免频繁创建和销毁带来的系统开销。从技术价值看,它能有效降低资源消耗、提升任务响应速度,并增强系统的稳定性和可管理性,是构建高并发、高性能服务架构的基石。在实际应用场景中,无论是处理CPU密集型计算任务,还是应对IO密集型网络请求,合理的线程池配置都至关重要。本文聚焦于Java中ThreadPoolExecutor的核心参数解析、任务处理流程,并结合java面试八股文与springcloud微服务等高频场景,深入探讨如何根据

weixin_30879833的博客 449

多线程总结--线程池ThreadPoolExecutor

一.ThreadPoolExecutor介绍private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(100000),new ThreadPoolExecutor.CallerRunsPolicy());线程

瓶子的博客 532

Java线程池六大核心参数原理与生产调优指南

线程池是Java并发编程中最基础且关键的资源调度机制,其本质并非静态容器,而是基于CPU、内存与等待资源动态平衡的状态机。理解ThreadPoolExecutor的corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory和handler六大参数的物理意义,是避免OOM、线程泄漏与拒绝风暴的前提。这些参数共同构成服务SLA的底层契约,直接影响P99响应时间、吞吐量稳定性与故障恢复能力。在电商、支付、风控等高并发场景中,需结合IO/CP

as2886089的博客 520

Java线程池核心原理与实战配置指南

线程池作为Java并发编程的核心技术,通过复用线程资源显著提升系统性能。其核心原理基于生产者-消费者模型,通过维护固定数量的工作线程和任务队列实现高效任务调度。在工程实践中,合理配置corePoolSize、maximumPoolSize、workQueue等参数对系统稳定性至关重要,特别是处理高并发请求或批量任务时。典型应用场景包括Web服务器请求处理、异步日志记录和大数据处理等。本文深入解析线程池的Worker复用机制和动态参数调整方案,并针对ArrayBlockingQueue和LinkedBlock

weixin_30681615的博客 300

Java线程池核心原理与面试实战指南

线程池是多线程编程中的核心组件,通过复用线程资源降低系统开销。其工作原理基于生产者-消费者模型,通过corePoolSize、maximumPoolSize等参数控制线程生命周期,配合BlockingQueue实现任务缓冲。合理配置线程池能显著提升系统吞吐量,特别适合处理突发流量和高并发IO操作。在电商订单处理、金融交易等场景中,线程池的参数调优和异常处理直接影响系统稳定性。面试中常考察ThreadPoolExecutor的底层机制、Executors工具类的潜在风险,以及如何结合CPU密集型和IO密集型任

weixin_30905981的博客 398

面试官挖坑:线程池动态调参导致Core>Max,系统会发生什么?

兄弟们,这才是真正的实战教学。很多人自己都没跑过代码,背着八股文就去面试了。但这一个“23 和 5”的问题,以及 JDK 版本演进的 Fail-Fast 机制,直接揭露了 JDK 底层的锁机制和线程池的生命周期管理。下次面试如果遇到聊“动态线程池”,你直接把这个“扩容时 Core 超过 Max 导致的疯狂自杀拔河现象”以及“JDK 8 到 17 的源码演进”甩给面试官。面试官绝对当场被你震慑,这才是踏踏实实踩过坑、流过血、看过源码的架构师该有的水平!

stone_tmp的博客 388
上一篇: JDK8线程池-Executors-ThreadPoolExecutor用法
下一篇: 为什么对象重写equals方法必须重写hashCode方法
fenglllle
博客等级 码龄8年 461粉丝 242原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值