Java 线程池

线程池

Java 线程池是一种多线程处理技术,它可以在程序中预先创建一定数量的线程,将任务提交到线程池中,线程池会自动调度线程执行任务。通过使用线程池,可以避免反复创建和销毁线程的开销,提高程序性能,同时也能够避免线程资源的浪费和过度使用。

为什么使用线程池?

在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:
1、频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。
2、对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。
3、系统无法合理管理内部的资源分布,会降低系统的稳定性。

Java 线程池的主要优势包括:
1、重用线程:线程池中的线程可以被重复利用,避免了创建和销毁线程的开销,提高了程序的性能。
2、提高程序的响应速度:当有任务到来时,线程池中已经有了准备好的线程,可以立即处理任务,而不需要等待线程的创建。
3、提高资源利用率:由于线程的创建和销毁是一项昂贵的操作,使用线程池可以避免不必要的资源浪费。

Java线程池涉及内容

java中涉及到线程池的相关类均在jdk1.5开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。
这些接口和类都是Java中用于实现线程池的核心组件,它们的作用如下:
1、Executor 接口定义了一种将任务提交与任务执行分离的标准方式,它只有一个方法 execute(Runnable command),用于执行传入的任务。
2、Executors 类是一个工厂类,提供了创建各种类型线程池的静态工厂方法。例如,newFixedThreadPool(int nThreads) 方法可以创建一个固定大小的线程池。
3、ExecutorService 接口继承自 Executor 接口,提供了更加丰富的任务执行管理方法,例如可以通过 submit(Callable task) 方法提交一个有返回值的任务,并返回一个 Future 对象来表示任务的执行结果。
4、ThreadPoolExecutor 类是一个线程池的具体实现,实现了 ExecutorService 接口。它可以根据需要自动调整线程池中的线程数量,以满足当前任务的需求。
5、FutureTask 类表示一个异步计算任务,它实现了 RunnableFuture 接口,可以在执行完成后返回一个结果。它可以被提交给 Executor 或 ExecutorService 进行执行。
6、Callable 接口类似于 Runnable 接口,但它可以返回一个值,并且可以抛出异常。
7、Runnable 接口表示一个可以被执行的任务。

Java线程池通常由以下四个组件组成:
任务队列:用于存放需要执行的任务。
线程池管理器:用于创建、销毁线程池,并控制线程池的状态。
工作线程:实际执行任务的线程。
任务:需要执行的具体业务逻辑。

线程池的创建及重要参数

Java 线程池的实现主要通过 Executor 框架提供的线程池接口实现。常用的线程池类型包括:
1、FixedThreadPool:固定大小的线程池,可以控制并发线程的数量。
2、CachedThreadPool:可以根据需要创建新的线程,但在可用线程的数量超过处理需求时,线程池会回收空闲的线程。
3、ScheduledThreadPool:用于执行周期性任务和延迟任务,支持定时执行任务和循环执行任务。
4、SingleThreadExecutor:只有一个工作线程的线程池,可以保证所有的任务按照指定的顺序在一个线程中执行。

  public static ExecutorService newFixedThreadPool(int var0) {return new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());}public static ExecutorService newSingleThreadExecutor() {return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()));}public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue());}public static ScheduledExecutorService newScheduledThreadPool(int var0) {return new ScheduledThreadPoolExecutor(var0);}

Java中的线程池核心实现类是ThreadPoolExecutor。
在这里插入图片描述

 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {……}

使用线程池的关键是合理地配置线程池的参数,例如线程池的大小、任务队列的大小、线程的超时时间等。如果线程池的参数设置不当,可能会导致线程池中的线程数量不足或者过多,从而影响程序的性能。

ThreadPoolExecutor实现的顶层接口是Executor,顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦。用户无需关注如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器(Executor)中,由Executor框架完成线程的调配和任务的执行部分。ExecutorService接口增加了一些能力:(1)扩充执行任务的能力,补充可以为一个或一批异步任务生成Future的方法;(2)提供了管控线程池的方法,比如停止线程池的运行。AbstractExecutorService则是上层的抽象类,将执行任务的流程串联了起来,保证下层的实现只需关注一个执行任务的方法即可。最下层的实现类ThreadPoolExecutor实现最复杂的运行部分,ThreadPoolExecutor将会一方面维护自身的生命周期,另一方面同时管理线程和任务,使两者良好的结合从而执行并行任务。

ThreadPoolExecutor是如何运行,如何同时维护线程和执行任务的呢?其运行机制如下图所示:

在这里插入图片描述

corePoolSize:核心线程数,也是线程池中常驻的线程数,线程池初始化时默认是没有线程的,当任务来临时才开始创建线程去执行任务
maximumPoolSize:最大线程数,在核心线程数的基础上可能会额外增加一些非核心线程,需要注意的是只有当workQueue队列填满时才会创建多于corePoolSize的线程(线程池总线程数不超过maxPoolSize)
keepAliveTime:非核心线程的空闲时间超过keepAliveTime就会被自动终止回收掉,注意当corePoolSize=maxPoolSize时,keepAliveTime参数也就不起作用了(因为不存在非核心线程);
unit:keepAliveTime的时间单位
workQueue:用于保存任务的队列,可以为无界、有界、同步移交三种队列类型之一,当池子里的工作线程数大于corePoolSize时,这时新进来的任务会被放到队列中
threadFactory:创建线程的工厂类,默认使用Executors.defaultThreadFactory(),也可以使用guava库的ThreadFactoryBuilder来创建
handler:线程池无法继续接收任务(队列已满且线程数达到maximunPoolSize)时的饱和策略,取值有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy

workQueue队列

SynchronousQueue(同步移交队列):队列不作为任务的缓冲方式,可以简单理解为队列长度为零
LinkedBlockingQueue(无界队列):队列长度不受限制,当请求越来越多时(任务处理速度跟不上任务提交速度造成请求堆积)可能导致内存占用过多或OOM
ArrayBlockintQueue(有界队列):队列长度受限,当队列满了就需要创建多余的线程来执行任务

handler拒绝策略

AbortPolicy:中断抛出异常
DiscardPolicy:默默丢弃任务,不进行任何通知
DiscardOldestPolicy:丢弃掉在队列中存在时间最久的任务
CallerRunsPolicy:让提交任务的线程去执行任务(对比前三种比较友好一丢丢)

关闭线程池

shutdownNow():立即关闭线程池(暴力),正在执行中的及队列中的任务会被中断,同时该方法会返回被中断的队列中的任务列表
shutdown():平滑关闭线程池,正在执行中的及队列中的任务能执行完成,后续进来的任务会被执行拒绝策略
isTerminated():当正在执行的任务及对列中的任务全部都执行(清空)完就会返回true

springboot使用线程池

/*** @Description 配置类中构建线程池实例,方便调用*/
@Configuration
public class ThreadPoolConfig {@Bean(value = "threadPoolInstance")public ExecutorService createThreadPoolInstance() {//通过guava类库的ThreadFactoryBuilder来实现线程工厂类并设置线程名称ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build();ExecutorService threadPool = new ThreadPoolExecutor(10, 16, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100), threadFactory, new ThreadPoolExecutor.AbortPolicy());return threadPool;}
}
  //通过name=threadPoolInstance引用线程池实例@Resource(name = "threadPoolInstance")private ExecutorService executorService;@Overridepublic void spikeConsumer() {//TODOexecutorService.execute(new Runnable() {@Overridepublic void run() {//TODO}});}

.其它相关

在ThreadPoolExecutor类中有两个比较重要的方法引起了我们的注意:beforeExecute和afterExecute

 protected void beforeExecute(Thread var1, Runnable var2) {}protected void afterExecute(Runnable var1, Throwable var2) {
}

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

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

相关文章

monorepo更新组件报错,提示“无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本”

解决方法&#xff1a; 第一步&#xff1a;管理员身份运行 window.powershell&#xff0c; win x打开powerShell命令框&#xff0c;进入到对应项目路径。 第二步&#xff1a;执行&#xff1a;get-ExecutionPolicy&#xff0c;显示Restricted&#xff0c;表示状态是禁止的; 第…

面试前的准备:程序员应该如何备战面试

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

盲盒电商小程序

一、准备阶段 在开始制作盲盒小程序前&#xff0c;你需要在乔拓云平台上创建一个账号&#xff0c;并登录到后台管理页面。在后台管理页面&#xff0c;你可以找到商城管理模块&#xff0c;点击进入商城编辑制作页面。 二、小程序商城模板选择与编辑 1.在商城编辑制作页面&#x…

2023.08.27 学习周报

文章目录 摘要文献阅读1.题目2.重点3.引言4.方法5.实验结果6.结论 深度学习Majorization-Minimization算法1.基本思想2.要求3.示意图 总结 摘要 This week, I read a computer science on the prediction of atmospheric pollutants in urban environments based on coupled d…

AUTOSAR汽车电子系统架构标准

AUTOSAR 目录 AUTOSAR RTE SWC和BSW SWC访问代码实现 ARXML&#xff08;AUTOSAR XML&#xff09; Interface Client-Server接口代码实现 AutoSAR OS Application AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;正式发布日期是2003年&#xff0c;…

Linux系统编程:基础知识入门学习笔记汇总

Linux基础shell编程——>Linux 系统编程——>&#xff08;计算机网络&#xff09;——>Linux 网络编程 来源&#xff1a;黑马程序员-Linux系统编程 45小时 评价 这个老师好像讲了很多课程&#xff0c;都还不错我由于赶时间之前学过Linux的Shell编程和Linux的网络编程&…

swagger 2.10.5 整合 spring boot

参考&#xff1a; http://springfox.github.io/springfox/ https://github.com/springfox/springfox http://springfox.github.io/springfox/docs/current/ https://github.com/springfox/springfox-demos https://github.com/springfox/springfox-demos/tree/2.9.2 https://gi…

pandas读取excel,再写入excel

需求是这样的&#xff0c;从一个表读取数据&#xff0c;然后每次执行创建一个新表将值写入 读取这个表 写入到这个表 分别对应的是e、h列数据&#xff0c;代码如下&#xff1a; import pandas as pd import openpyxl import datetime dfpd.read_excel(rC:\Users\admin\Deskt…

设计模式-职责链模式

文章目录 职责链模式模式概述主要角色适用场景实现步骤优点注意事项 定义职责链结构示例总结 职责链模式 职责链模式是一种行为设计模式&#xff0c;它可以将请求的发送者和请求的处理者解耦&#xff0c;并按照预定义的顺序处理请求。职责链模式常用于需要逐级审批或转交处理的…

【电路设计】220V AC转低压DC电路概述

前言 最近因项目需要,电路板上要加上一个交流220V转低压直流,比如12V或者5V这种。一般来说,比较常见也比较简单的做法是使用一个变压器将220V AC进行降压,比如降到22V AC,但是很遗憾的是,支持220V的变压器一般体积很大,而板子留给电源部分的面积又非常有限,所以不得不研…

OpenHarmony组件复用示例

本文转载自《#2023盲盒码# OpenHarmony组件复用示例》&#xff0c;作者zhushangyuan_ 摘要&#xff1a;在开发应用时&#xff0c;有些场景下的自定义组件具有相同的组件布局结构&#xff0c;仅有状态变量等承载数据的差异。这样的组件缓存起来&#xff0c;需要使用到该组件时直…

C++中的运算符总结(7):复合赋值运算符

C中的运算符总结&#xff08;7&#xff09;&#xff1a;复合赋值运算符 复合赋值运算符将运算结果赋给左边的操作数。 请看下面的代码&#xff1a; int num1 22; int num2 5; num1 num2; // num1 contains 27 after the operation其中最后一行代码与下面的代码等效&#…

玩转软件|钉钉个人版内测启动:AI探索未来的工作方式

目录 前言 正文 AI为核心&#xff0c;个人效率为王&#xff01; 指令中心&#xff0c;解锁AI技巧&#xff01; 灵感Store&#xff0c;探索更多可能&#xff01; 未来的AI&#xff0c;即将问世&#xff01; 个人内测体验 前言 重磅消息&#xff1a;钉钉个人版在8月16日正…

前端面试的性能优化部分(14)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分&#xff08;1&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;2&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;3&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;4&#xff09;每天…

c# modbus CRC计算器(查表法)

一、简介&#xff1a; 本案例为crc计算器&#xff0c;通过查表法计算出结果 1.窗体后台源代码 using Crc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text…

Stm32的时钟系统以及使用SysTick滴答定时器实现延时

前言 STM32的时钟系统由多个时钟源和时钟树组成时钟源包括主时钟源&#xff08;HSE&#xff09;、内部高速时钟源&#xff08;HSI&#xff09;、内部低速时钟源&#xff08;LSI&#xff09;和外部低速时钟源&#xff08;LSE&#xff09;。时钟树由多个时钟分频器和时钟门控器组…

一道经典面试题:@Configuration 和 @Component 有何区别?

关于 Configuration 注解有一个特别经典的面试题&#xff1a; Configuration 和 Component 有什么区别&#xff1f; 无论小伙伴们之前是否背过相关的面试题&#xff0c;今天这篇文章学完之后相信大家对这个问题都会有更深一层的理解&#xff0c;废话不多少&#xff0c;咱们开…

容器和宿主机之间的存储问题

简介 作用&#xff1a;方便备份恢复数据&#xff0c;实现数据共享 一、单台机器中 用数据卷挂载 二、多台机器中 ssh 建立免密通道将数据scp过去&#xff0c;然后再用卷挂载到容器内 nfs 网络文件系统 搭建nfs服务器客户端挂载 过程如下 一.安装软件包yum install -…

新能源汽车技术的最新进展和未来趋势

文章目录 电池技术的进步智能驾驶与自动驾驶技术充电基础设施建设新能源汽车共享和智能交通未来趋势展望结论 &#x1f389;欢迎来到AIGC人工智能专栏~探索新能源汽车技术的最新进展和未来趋势 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客…

Rust 学习笔记(卷二)

文章目录 Rust 学习笔记&#xff08;卷二&#xff09;八、工程1. package 和 cratepackage 总览包根&#xff08;crate root&#xff09; 2. 模块初识模块单个源文件中的嵌套模块具有层级结构的源文件形成的嵌套模块小结 use 语句 3. 文档4. 使用第三方包5. 打包自己的包 九、标…