【Java线程池详解】—— 每天一点小知识

news2025/2/1 11:43:49

在这里插入图片描述

                                                                              💧 J a v a 线程池 \color{#FF1493}{Java线程池} Java线程池💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • Java线程池详解
    • 🌊为什么要使用线程池?
    • 🌊线程池的核心参数
      • 💧corePoolSize
      • 💧maximumPoolSize
      • 💧keepAliveTime
      • 💧unit
      • 💧workQueue
      • 💧threadFactory
      • 💧handler
    • 🌊常见的线程池类型
      • 💧FixedThreadPool
      • 💧CachedThreadPool
      • 💧SingleThreadPool
      • 💧ScheduledThreadPool
    • 🌊总结
  • 🐳结语


Java线程池详解

    💧在Java编程中,线程池是一个非常重要的概念。它可以帮助我们更好地管理线程,提高程序的性能和稳定性。本文将从多个角度详细介绍Java线程池。

🌊为什么要使用线程池?

    💧在Java中,每个线程都需要占用一定的系统资源,包括内存、CPU等。如果我们在程序中频繁地创建和销毁线程会导致系统资源的浪费,从而影响程序的性能和稳定性。而线程池可以帮助我们复用已经创建的线程,避免频繁地创建和销毁线程,从而提高程序的性能和稳定性

🌊线程池的核心参数

Java线程池有多个核心参数,下面我们来逐一介绍它们的作用。

在这里插入图片描述

💧corePoolSize

    corePoolSize是线程池的核心线程数。当提交一个任务到线程池时,如果当前线程池中的线程数小于corePoolSize,那么线程池会创建一个新的线程来执行该任务。如果当前线程池中的线程数大于等于corePoolSize,那么线程池会将该任务放入任务队列中等待执行

💧maximumPoolSize

    maximumPoolSize是线程池的最大线程数。当任务队列已满且当前线程池中的线程数小于maximumPoolSize时,线程池会创建一个新的线程来执行该任务。如果当前线程池中的线程数已经达到maximumPoolSize,那么线程池会根据拒绝策略来处理该任务

💧keepAliveTime

    keepAliveTime是线程池中的线程空闲时间。当线程空闲时间达到keepAliveTime时,该线程会被销毁直到线程池中的线程数小于corePoolSize。

💧unit

    unit是keepAliveTime时间单位,可以是秒、毫秒、微秒等

💧workQueue

    workQueue是任务队列用于存放等待执行的任务。Java线程池提供了多种类型的任务队列,包括ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue等。

💧threadFactory

    threadFactory是用于创建新线程的工厂类。如果不指定threadFactory,线程池会使用默认的线程工厂类。

💧handler

    handler是拒绝策略,用于处理无法处理的任务。Java线程池提供了多种类型的拒绝策略,包括AbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy等。

🌊常见的线程池类型

Java线程池提供了多种类型的线程池,下面我们来逐一介绍它们的特点和适用场景。

💧FixedThreadPool

    FixedThreadPool是固定大小的线程池,它的核心线程数和最大线程数都是固定的。当任务队列已满且当前线程池中的线程数小于最大线程数时,线程池会创建新的线程来执行任务。适用于执行长期的任务,性能稳定

创建FixedThreadPool可以使用Java中的Executors类的静态方法newFixedThreadPool(int n),其中n表示线程池中线程的数量。例如,以下代码创建一个包含5个线程的FixedThreadPool:

ExecutorService executor = Executors.newFixedThreadPool(5);

创建后,可以使用submit()方法向线程池提交任务,例如:

executor.submit(new MyTask());

其中,MyTask是一个实现了Runnable接口的任务类。任务执行完成后,可以使用shutdown()方法关闭线程池:

executor.shutdown();

这将等待所有任务完成后关闭线程池。如果需要立即关闭线程池,可以使用shutdownNow()方法。

💧CachedThreadPool

    CachedThreadPool是可缓存的线程池,它的核心线程数为0,最大线程数为Integer.MAX_VALUE。当有新的任务提交到线程池时,线程池会创建新的线程来执行任务。当线程空闲时间超过60秒时,线程会被销毁。适用于执行短期的任务,性能较高

可以使用 Executors.newCachedThreadPool() 方法来创建一个 CachedThreadPool 线程池。

ExecutorService executor = Executors.newCachedThreadPool();

在创建线程池之后,可以使用 executor.execute() 方法来提交任务给线程池执行。例如:

executor.execute(new Runnable() {
    @Override
    public void run() {
        // 执行任务的代码
    }
});

需要注意的是,CachedThreadPool线程池没有固定的线程数限制,因此如果提交的任务过多,可能会导致系统资源耗尽。因此,在使用CachedThreadPool线程池时,需要根据实际情况评估任务的数量和系统资源的可用性。

💧SingleThreadPool

    SingleThreadPool是单线程的线程池,它的核心线程数和最大线程数都为1。适用于需要保证任务按照顺序执行的场景。

ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();

创建完成后,可以使用submit()方法提交任务,示例代码如下:

singleThreadPool.submit(new Runnable() {
    @Override
    public void run() {
        // 执行任务的代码
    }
});

执行完任务后,需要关闭线程池,示例代码如下:

singleThreadPool.shutdown();

💧ScheduledThreadPool

    ScheduledThreadPool是定时任务的线程池,它可以定时执行任务。适用于需要定时执行任务的场景。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(nThreads);

nThreads是线程池中线程的数量。可以根据需要调整该值。创建完成后,就可以使用executor的schedule方法来定时执行任务了。例如:

executor.schedule(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
}, delay, TimeUnit.SECONDS);

delay是任务延迟执行的时间,TimeUnit是时间单位。上述代码表示延迟delay秒后执行任务。如果需要定时执行任务,可以使用scheduleAtFixedRate方法,例如:

executor.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
}, initialDelay, period, TimeUnit.SECONDS);

initialDelay是任务第一次执行的延迟时间,period是任务执行的周期,例如每隔period秒执行一次。


🌊总结

💧Java线程池是Java编程中非常重要的概念,它可以帮助我们更好地管理线程提高程序的性能和稳定性。希望本文能够帮助读者更好地理解和使用Java线程池。

在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-6-10-第一式工厂方法模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

安卓与串口通信-数据分包的处理

前言 本文是安卓串口通信的第 5 篇文章。本来这篇文章不在计划内,但是最近在项目中遇到了这个问题,正好借此机会写一篇文章,在加深自己理解的同时也让大伙对串口通信时接收数据可能会出现分包的情况有所了解。 其实关于串口通信会可能会出现…

编译tolua——3、以pbc为例子,添加第三方库

目录 1、编译工具和环境说明 2、基础编译tolua 3、以pbc为例子,添加第三方库 4、更新luaJit 大家好,我是阿赵。 之前分享过怎样正常编译基础版本的tolua。这次用添加pbc为例,看看怎样往tolua里面添加其他的第三方库。知道了方法之后&#xf…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好,我是郭东白。上节课我们讲了为什么要做阶段性的价值交付,以及进入阶段性价值交付环节的准备工作。有了这些学习基础,这节课我们就可以进行阶段性价值交付了。 在交付的过程中,主要有三部分工作:目标分解、定义交…

SLAM十四讲——ch4实践(李群李代数)

视觉SLAM14讲----ch4的操作及避坑 一、ch4的实践的准备工作二、各个实践操作1. Sophus的基本使用方法2. 例子:评估轨迹误差 三、遇到的问题 一、ch4的实践的准备工作 确保已经有Sophus库,Sophus库是一个较好的李代数库。 注意: 开始时slamb…

MySQL 数据库实用指南:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书,小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结:文末赠书 一、准备测…

Linux之进程间通信——system V(共享内存、消息队列、信号量等)

文章目录 前言一、共享内存1.共享内存的基本原理2.共享内存的创建3.共享内存的控制参数返回值共享内存的内核数据结构 4.共享内存的关联参数 5.共享内存的去关联6.查看IPC资源7.查看共享内存8.删除共享内存 二、实现进程间通信(代码)三、共享内存的特点四…

【Newman+Jenkins】实施接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子,哈哈,开玩笑啦。。。别当真,简单地说Newman就是命令行版的Postman,查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行,把Postman界面化运…

软件测试—冒烟测试

1. 核心 冒烟测试就是完成一个新版本的开发后,对该版本最基本的功能进行测试,保证基本的功能和流程能走通。 如果不通过,则打回开发那边重新开发; 如果通过测试,才会进行下一步的测试(功能测试,集成测试…

【ThreadLocal为什么可能内存泄漏?】 —— 每天一点小知识

💧 T h r e a d L o c a l 为什么可能内存泄漏? \color{#FF1493}{ThreadLocal为什么可能内存泄漏?} ThreadLocal为什么可能内存泄漏?💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个…

渗透测试综合实验

文章目录 一、前期交互二、信息搜集三、威胁建模五、渗透攻击1.弱口令攻击2.SQL注入3.不安全文件上传 六、后渗透攻击利用1.蚁剑安装2.一句话木马利用 七、漏洞报告 一、前期交互 二、信息搜集 使用nmap收集端口、域名、后台信息 目标IP nmap -O -sV IP 三、威胁建模 寻…

基于javaweb jsp+servlet实验室设备管理系统的设计与实现

一.项目介绍 本系统分为 超级管理员、老师、学生三类角色 超级管理员:通知管理、维护用户信息、实验室管理(负责维护实验室、预约实验室)、设备管理(维护技术参数、维护运行数据、维护电子文档)、设备维修管理&am…

第5章 总体设计

第5章 总体设计 总体设计是决定”怎样做”。也就是概括的说,系统应该如何实现,因此总体设计也被称作概要设计。 5.1 设计过程 例题 5.2 设计原理 5.2.1 模块化 模块是由边界元素限定的相邻程序元素(例如,数据说明,…

【Spring Boot】Spring Boot特点及重要策略,含安装步骤详细讲解

前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应…

Matplotlib 绘制多图

Matplotlib 绘制多图 我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。 subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。 subplot subplot(nrows, ncols, inde…

微服务_Nacos

简介 Nacos(全称为“动态服务发现、配置和服务管理平台”)是阿里巴巴开源的一款云原生服务发现和配置管理平台,支持多种语言和多种环境,包括Kubernetes、Docker、Spring Cloud等常见的云原生环境。它提供了服务发现、配置管理、服…

MFC的定义和实际操作方法

我是荔园微风,作为一名在IT界整整25年的老兵,今天从另一个角度来看一下MFC。 完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类 过程:CWinApp创建CF…

算法刷题-链表-反转链表

反转链表 206.反转链表思路C代码双指针法递归法其他语言版本使用虚拟头结点解决链表翻转使用栈解决反转链表的问题 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 …

【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&…

【线程安全问题】线程互斥与线程同步技术

在达内Windows/Win32编程专栏中,我们已经介绍过线程同步与线程互斥技术,包括了原子锁,互斥体,事件和信号量。但是与海哥讲的线程同步与线程互斥技术不太一样,这篇文章来带领大家学习线程同步与线程互斥技术&#xff0c…