百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Java线程池总结(java线程池实战)

yund56 2025-07-09 21:35 3 浏览

1. 为什么要使用线程池

线程池的工作主要是控制线程的数量。处理过程中将任务放入等待队列,然后在线程创建后执行这些任务。

优点:线程复用,控制最大并发数,管理线程

2. JDK提供的线程池

主要关注两个类:

ThreadPoolExecutor:线程池核心类

Executors:创建线程池的工具类

通过Executors工具类创建线程池的3种方式

  • 创建线程数固定的线程池
public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}
  • 创建单线程的线程池
public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

Single线程池可以理解为Fixed线程池的特例

  • 创建可缓冲线程的线程池
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

通过ThreadPoolExecutor核心类创建线程池的方式

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

ThreadPoolExecutor构造方法的7大参数

corePoolSize:线程池中常驻的核心线程数

maximumPoolSize:线程池中可容纳的最大线程数

keepAliveTime:空闲的临时线程的存活时间(当线程池中的线程数量超过corePoolSize时,临时创建的线程如果空闲时长达到keepAliveTime,那么该临时线程将被销毁,直到只剩corePoolSize个线程为止)

unit:keepAliveTime的单位

workQueue:缓存任务的队列

threadFactory:创建线程的工厂

handler:拒绝策略(当缓存队列已满,且线程池中的线程数也达到了最大线程数,此时应该采用何种策略拒绝新来的任务)

3. 线程池底层逻辑

  1. 线程池初始化后不会立即创建线程,而是等到有任务来时才创建核心线程。
  2. 当线程池中核心线程数已满后并不会立即扩容线程池,而是把任务放到等待队列中。
  3. 当等待队列已满后,创建临时线程执行任务,直到总线程数达到maximumPoolSize为止。
  4. 如果等待队列已满且总线程数达到最大值后还有任务进来,则按照设置的拒绝策略处理。
  5. 当总线程数大于核心线程数时,空闲的临时线程等待keepAliveTime(unit)后将自动销毁。

4. 线程池需要手工创建

JDK中的Executors工具类定义了一些快捷地创建线程池的方法,但是《阿里巴巴Java开发手册》中提到,我们应该禁止使用这些方法来创建线程池,而应该手动通过new ThreadPoolExecutor来创建线程池。

原因如下:

(七) 并发处理

4.【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

说明:Executors返回的线程池对象的弊端如下:

1) FixedThreadPool和SingleThreadPool:

允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。

2) CachedThreadPool:

允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

相关推荐

怎么用deepseek生成图片?2步用DS一键AI文生图!

用过deepseek的人都知道,deepseek可生成的内容主要集中在文本,如文章、故事、诗歌、代码片段、列表等,不像其他多模态大模型,可以生成图片、视频、PPT、思维导图、流程图、简历等,无法满足多...

商业流程图怎么画?亿图在线教你制作专业又实用的商业流程图

商业流程图就是将所进行的商业活动以图表的形式展示,并且具体的商业活动之间有着严格的先后顺序限定,除此以外,活动的内容、方式、责任等也都必须有明确的安排和界定。这样不仅可以让人们更加清楚直观的了解商业活...

「简单的流程图制作」流程图制作技巧与方法

流程图是表达思路的最好方法,千言万语不如一张图,这话一点毛病都没有。对某一个问题的定义、分析或解法的图形表示,图中用各种符号来表示操作、数据、流向以及装置等。为了便于识别,绘制流程图都有很多定义符号,...

想要画好流程图,你只需要这3个简单的小方法,30秒立马搞定

我们都知道,现在有很多人在工作中都需要制作易看易懂的流程图,但是说起来简单,想要画一个流程图却不是一件简单的事情,要想画的好看那就更难了!别担心,今天小编将分享几个非常简单的方法给大家,30秒就能画出...

如何让DeepSeek做流程图?DS高阶使用技巧分享!

万物皆可DeepSeek,DeepSeek的应用之广,已到了“遇事不决,先问DeepSeek”的地步,现在但凡遇到没有思路、或是懒得动手的情况,许多人会第一时间求助DeepSeek,让它帮我们出谋划策...

系统流程图是什么?功能强大好用的流程图制作软件

系统流程图是概括的描绘系统物理模型的方式,运用图形符号并以黑盒子形式描绘系统里面的每个具体部件(包括:程序、文件、数据库、表格、人工过程等),表示数据在系统各个部件之间流动的情况、反应系统的处理流程。...

Mermaid代码如何生成流程图?职场人必备的AI绘图技巧盘点!

Mermaid是一个多义词,直译为美人鱼,但在绘图的语境下,Mermaid是一个专有名词,是一种基于文本的图表生成工具,通过简洁的代码语法(类似Markdown)快速绘制流程图、时序图、思维导图等。各...

3个制作流程图的专业方法,看了就会

PPT制作流程图不难,不过精美模板需要会员才可以使用。PPT主打的功能毕竟不是制作流程图,除了分享PPT制作流程图的方法,同时我也会介绍专业的软件制作流程图的方法,需要的码住哦~1、PPT【有PPT会...

WPS还可以插入流程图?1秒就可以制作高大上的流程图,太逆天

WPS里面有很多好用的功能大家是知道的,但是怎么插入流程图大家知道吗?接下来就带大家一起看看吧!一、WPS插入1.流程图按钮首先我们找到【流程图】按钮,然后点击【插入流程图】,既可以顺利在我们的WPS...

流程图用什么软件做?分享4款流程图绘制工具

在生活中,我们经常会使用流程图来绘制出一些事项的工作流程或过程,让整个过程看上去更直观清晰,并且能更好的了解到操作步骤或过程中各步骤的逻辑顺序,那么流程图用什么软件做呢?这里分享4款好用的流程图绘制工...

程序流程图怎么画?(程序流程图怎么画是不是就是操作步骤)

程序流程图相信大家中学的时候都接触过,它是由一些特定的符号串联起来的一整张流程图,每一个符号都有特定的含义,通过连接线将起止框、判断框等连接起来。程序流程图的特点是画面清晰简单,由一些固定符号框组成,...

软网推荐:不装软件 云端制作流程图

平时工作中需要制作各种各样的流程图、思维导图等,但是要想制作这些图片的话需要安装不同的软件才可以。但是这些软件不但占用大量的磁盘空间,而且也可能会导致系统运行的不删除。所以如果不是经常使用软件的话,那...

花1分钟用Word手动绘制流程图,看完我学会了

关注职场办公,分享实用干货,洞察科技资讯!大家好,这里是职场科技范~工作中,有时候需要我们绘制流程图,难倒了不少朋友,今天就来教大家花1分钟时间,用Word手动绘制流程图,看完我学会了。①首先我们打开...

用Excel做“流程图”竟然这么方便,光速提高效率,用起来太爽了

想必许多人都了解过“流程图”吧!通过归纳“任务流程”的前后次序安排,能够直观清晰地整理出工作/活动的具体安排!所以今天跟着我的步伐、一起来学习“Excel该怎么制作流程图”吧!一、汇总流程安排01、填...

跨职能流程图模板大全!便捷套用快速绘制流程图

跨职能流程图可以将参与流程的组织和部门之间的联系通过图形表现出来。换一种说话就是突出参与各流程对象之间的联系,让每个对象明确自己所处的环节。让参与对象更好的评估项目成本和存在的风险。跨职能流程图分为水...