【Java】Java核心要点总结:61

news2024/10/7 14:29:29

文章目录

  • 1. java中的线程池是如何实现的
  • 2. 创建线程池的几个核心参数
  • 3. Java 中线程池的执行流程
  • 4. 为什么要使用线程池
  • 5. 线程池的拒绝策略


在这里插入图片描述

1. java中的线程池是如何实现的


Java 中的线程池是通过 ThreadPoolExecutor 类实现的。ThreadPoolExecutor 继承自 AbstractExecutorService,并实现了 Executor、ExecutorService 和 Future 接口,它可以为程序提供管理和控制多个工作者线程的功能,提高线程重用性并避免线程频繁创建销毁的开销。

ThreadPoolExecutor 的主要组成部分包括:

corePoolSize:核心线程池大小,默认情况下核心线程不会被回收,即使没有任务需要执行。

maximumPoolSize:线程池最大线程数,用于控制线程数上限,当队列已满且当前线程数小于最大线程数时,线程池会新建更多线程来执行就绪任务。

workQueue:工作队列,用于存放等待执行的任务。ThreadPoolExecutor 提供了四种类型的工作队列:SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue 和 PriorityBlockingQueue。

threadFactory:线程工厂,用于创建新的线程。

handler:拒绝策略,用于当工作队列已满、线程池中也达到最大线程数时,执行拒绝策略,通常有四种预定义的拒绝策略,AbortPolicy、DiscardPolicy、DiscardOldestPolicy 和 CallerRunsPolicy。

在使用线程池时,一般需要通过 Executors 工具类提供的一些静态方法创建 ThreadPoolExecutor 对象,并设置相应的参数来达到需要的执行效果。线程池中会通过 allocateThread 等方法来实现核心线程和工作线程的访问,通过 submit 和 execute 方法来接收新的任务并执行。

Java 中的线程池是通过 ThreadPoolExecutor 类实现的,它内部维护了一定数量的线程,能为程序提供线程管理和控制功能,避免频繁创建销毁线程的开销,提高线程重用性并提高整体性能。同时,开发者可以通过设置不同的参数来满足特定场景的需求。


2. 创建线程池的几个核心参数


创建线程池时,需要设置以下几个核心参数:

corePoolSize:核心线程池大小,用于控制线程数量的基础值。当一个新任务被提交到线程池,如果当前线程数小于 corePoolSize,那么线程池会为该任务分配一个新线程来处理它;如果线程数已经达到或超过了 corePoolSize,那么任务会被加入等待队列中等待处理。

maximumPoolSize:线程池最大线程数,用于控制线程数上限。当等待队列已满且当前线程数小于 maximumPoolSize 时,线程池会创建更多的线程来执行就绪任务,最大可创建线程数为 maximumPoolSize - corePoolSize。

workQueue:工作队列,对任务进行排队等待处理。当任务提交给线程池时,会先将任务保存到工作队列中,然后由空闲线程从队列取出任务并执行。

keepAliveTime:线程活动保持时间,即当线程空闲时间达到该值时,线程池会判断是否要回收该线程。keepAliveTime 需要与 TimeUnit(时间单位)一起使用,例如 TimeUnit.SECONDS。

threadFactory:线程工厂,用于创建新线程。可以通过实现 ThreadFactory 接口自定义线程创建方式以及给线程起特定的名字等。

handler:拒绝策略,用于当工作队列已满、线程池中也达到最大线程数时,执行拒绝策略。一般情况下,有四种预定义的拒绝策略:AbortPolicy(默认),DiscardPolicy、DiscardOldestPolicy 和 CallerRunsPolicy。

以上这些参数要根据实际情况进行设置,例如任务类型、任务量大小、执行时长等都可能会影响这些参数的选择和调整。


3. Java 中线程池的执行流程


Java 中的线程池通常由 java.util.concurrent.Executor 和其子接口 java.util.concurrent.ExecutorService 提供。 Executor 主要负责维护工作队列和线程池。当程序向 Executor 提交任务时,它将选择一个可用的线程并委派该任务执行;如果所有线程均已被占用,则该任务将被放到队列中等待执行。

线程池的执行流程如下:

  • 当线程池被创建时,它会预先创建指定数量的线程,这些线程处于空闲状态,并等待着任务的到来。

  • 当任务被提交后,线程池会首先判断是否有空闲线程,如果有,则将任务分配给某个空闲线程去执行;如果没有,则将该任务添加至任务队列等待执行。

  • 在某个线程开始执行一个任务时,线程池会将任务从任务队列中取出,并将该任务交给当前线程执行。

  • 线程执行完毕后并不会立即结束,而是重新加入到线程池的线程池(可重用)中,等待下一个任务的分配。

  • 当任务队列中有新任务时,线程池会根据先进先出的原则逐一从任务队列中获取任务,并将任务分配给其中一个空闲线程执行,重复步骤 3-4,直到任务队列为空。

  • 当某个线程空闲的时间超过指定的最大存活时间(keepAliveTime)时,线程池会将该线程从线程池中移除,以减少系统资源占用。

  • 线程池可由调用 ExecutorService 的 shutdown() 方法来关闭。当执行此操作时,线程池不再接受新任务,并且会依次将正在等待执行的任务和已经提交但还未被执行的任务继续执行完毕后停止。

线程池通过缓存线程以及统一调度和控制线程的创建、销毁等功能,尽可能地利用线程,避免了频繁创建和销毁线程带来的开销和性能问题,提高了系统的性能和稳定性。


4. 为什么要使用线程池


使用线程池的主要原因是在多线程编程时可以更有效地利用系统资源,提高程序并发性能

以下是使用线程池的几个优点:

降低开销:创建和销毁线程是一项耗费资源的操作。使用线程池在应用程序中重用线程,避免了频繁创建和销毁线程所带来的开销,降低了系统负担,提升了执行效率和吞吐量。

提高响应速度:当有新任务到来时,线程池中的线程可以立即响应,执行任务,缩短了任务等待时间,提高了系统的响应速度。

降低资源占用:通过限制线程的数量、大小等设置,可以避免过度的资源占用问题,确保系统运行的稳定性和可靠性。

统一管理:线程池为整个应用程序提供了一个统一的线程管理,对于线程的调度、监控、重用和回收等方面进行有效的管理和控制,提升了系统的可维护性和可扩展性。

控制最大并发数目:通过合理设置线程池的最大线程数量,可以防止某些代码片段(例如网络连接)出现过多的并发访问并导致系统瘫痪。

使用线程池能够更好地利用系统资源、提高并发性能和可靠性,减小资源消耗和浪费,是多线程编程不可缺少的重要工具和技巧。


5. 线程池的拒绝策略


线程池中的任务队列有一个固定的容量,当该队列已被填满,并且所有线程均处于忙碌状态时,新提交的任务就需要通过拒绝策略进行处理。线程池默认提供了四种拒绝策略:

  1. AbortPolicy(默认):该策略是线程池默认的拒绝策略。当向线程池提交任务失败时,直接抛出 RejectedExecutionException 异常并停止程序。

  2. CallerRunsPolicy:当向线程池提交任务失败时,将此任务交给提交该任务的线程来执行。这样做会降低新任务的速度,但可以保证当前正在执行的任务小概率被堵塞。

  3. DiscardOldestPolicy:当向线程池提交任务失败时,删除队列头部的任务,然后重新提交当前任务。

  4. DiscardPolicy:当向线程池提交任务失败时,直接将该任务丢弃。

如果默认的四种拒绝策略无法满足业务需求或者对业务代码产生负面影响,开发人员也可以基于 ThreadPoolExecutor 的子类重写 RejectedExecutionHandler 接口自定义特定的拒绝策略,以便更好地满足实际项目的需要。




在这里插入图片描述

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

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

相关文章

chatgpt赋能python:如何快速复制Python库到其他电脑

如何快速复制Python库到其他电脑 作为一名拥有10年Python编程经验的工程师,我深知Python库在项目开发中扮演着非常重要的角色。Python库能够帮助我们快速实现功能、减少重复工作以及提高代码质量。但是,在换电脑或在新的团队合作时,我们常常…

【PWN · ret2libc | Canary】[2021 鹤城杯]littleof

最近比较忙,这道题用了好长时间来debug,甚至贡献了第一次在csdn上提问。。。 目录 前言 一、题目重述&思路分析 二、exp 三、Canary 四、萌新遇到的困难 总结 前言 Canary作为经典且基本的栈保护措施,在后期的题目中必然是基本标…

STL——string模拟实现(一)

目录 构造函数的实现 拷贝构造 赋值重载 const问题 迭代器打印 范围for打印 运算符重载 reserve模拟 插入数据 push_back append 构造函数的实现 先贴出一段错误代码&#xff1a; #include<iostream> #include<assert.h> namespace zzl//避免与库冲突 {…

Servlet 详解

目录 什么是 servlet? Servlet 是做甚的? 如何编写一个 Servlet 程序? 解析访问出错情况 Servlet 的运行原理 1. 接收请求 2. 根据请求计算响应 3. 返回响应 Servlet API 详解 HTTPServlet HttpServletRequset HttpServletResponse 什么是 servlet? Servlet 是…

String模拟实现(二)

resize resize的特点是扩容加初始化&#xff0c;如果所给的长度小于空间大小就会删除多余的数据。前面我们实现了reserve&#xff0c;但有这样一个问题&#xff0c;如果reserve的长度小于空间就会导致缩容&#xff0c;而我们知道&#xff0c;string中缩容用的是shrink_to_fit&a…

外观设计模式解读

目录 问题引进 传统方式解决影院管理 外观模式基本介绍 概念 外观模式原理类图 分类外观模式的角色 外观模式解决影院管理 传统方式解决影院管理说明 外观模式应用实例 外观模式的注意事项和细节 s统的内部细节 > 外观模式 外观模式基本介绍 概念 1) 外观模式&…

XGBoost的介绍

一、XGBoost的介绍 1.什么是XGBoost&#xff1f; XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种基于梯度提升树的机器学习算法&#xff0c;它在解决分类和回归问题上表现出色。它是由陈天奇在2014年开发的&#xff0c;如今已成为机器学习领域中最流行和强…

集合框架知识汇总

集合框架 集合 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法。可以实现数组功能 和数组的区别 数组长度固定&#xff0c;集合长度不固定 数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型 总结 List集合 有序&#xff0c;有…

软考网工易混淆知识点总结(持续更新中,按照知识点先后排序)

1.数据编码--原码、反码和补码 原码 数值前面增加了一位符号位(即最高位为符号位)&#xff0c;该位为0时表示正数&#xff0c;为1时则表示负数&#xff0c;其余各位表示数值的大小反码 正数的反码与原码相同&#xff0c;负数的反码符号位为1&#xff0c;其余各位为该数绝对值的…

大型语言模(LLM) : 提示词工程(一)

今天我学习了DeepLearning.AI的 Prompt Engineering 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码&#xff1a; import openaiopenai.api_key XXXXXXXXXdef get_completion(prompt, model"gpt-3.5-…

高性能分布式API网关Kong

目录 1 kong网关简介2 为什么需要 API 网关2.1 和Spring Cloud Gateway区别 3 为什么要使用kong3.1 kong的组成部分3.2 Kong网关的特性 4 kong网关架构4.1 Kong网关请求流程 5 kong 部署5.1 搭建网络5.2 搭建数据库环境5.3 kong网关部署5.3.1 初始化kong数据5.3.2 启动Kong容器…

【项目】树莓派4B镜像安装

本文主要记录下如何使用Raspberry Pi image 软件进行树莓派镜像进行安装。 官网&#xff1a;Raspberry Pi OS – Raspberry Pi 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1G7z1Fdvk5Chmhj894WPU3A 提取码&#xff1a;xnzw 一、格式化SD卡 若SD卡存在…

释放潜能——解读新时代OEM竞争规则,打造精雕细琢的用户体验

从消费零售全领域的实践观察来看&#xff0c;仅仅凭借产品赢得竞争的时代已经过去&#xff0c;商业模式创新体现在越来越多企业向“产品服务”转变&#xff0c;向用户全生命周期需求挖掘转变。企业与消费者之间的关系从过去的一次性、断点式产品交易&#xff0c;转向持续性、覆…

读写ini配置文件(C++)

文章目录 1、为什么要使用ini或者其它(例如xml,json)配置文件&#xff1f;2、ini文件基本介绍3、ini配置文件的格式4、C读写ini配置文件5、 代码示例6、 配置文件的解析库 文章转载于&#xff1a;https://blog.csdn.net/weixin_44517656/article/details/109014236 1、为什么要…

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践 高分辨率大图像在 Web 中查看可以使用 Deep Zoom 技术&#xff0c;这是一种用于查看和浏览大型高分辨率图像的技术&#xff0c;它可以让用户以交互方式浏览高分辨率大图像&#xff0c;并且能够在不影响图像质量的情况下进行…

搭建个人网站 保姆级教程(四)Navicat链接mySql 失败

长时间没有折腾云服务器上的mysql了&#xff0c;今天再次使用Navicat连接云服务器上的mysql时&#xff0c;输入密码报错&#xff01; 1130 - Host ‘119.130.212.168’ is not allowed to connect to this MySQL server 1.于是Royal TSX 远程服务器查看mysql的状态 systemctl …

通达信标记文字中可能用到的特殊符号大全

特殊符号是难以直接输入的符号&#xff0c;特殊符号是符号的一种&#xff0c;比如说圆圈&#xff08;〇&#xff09;、叉号&#xff08;✕、✖、✘&#xff09;、五角星&#xff08;★、☆&#xff09;、勾号&#xff08;✓、✔&#xff09; 。 01.特殊符号简表 ♠♣♧♡♥❤…

chatgpt赋能python:Python强制取整:如何在Python中正确进行取整操作

Python强制取整&#xff1a;如何在Python中正确进行取整操作 Python是一种广泛使用的编程语言&#xff0c;有许多不同的用途&#xff0c;包括数据分析、web开发、机器学习、科学计算等等。Python语言非常容易学习和使用&#xff0c;但有时候它的行为可能会出人意料&#xff0c…

alpa概览

文章目录 背景alpa简介DeviceMesh跨 DeviceMeshes 的 GPU Buffer管理Ray CollectivePipeline parallelism runtime orchestration运行时 背景 LLM训练有3D并行的需求&#xff08;alpa将数据并行视为张量并行&#xff0c;即张量沿batch切分&#xff09; 算子间并行的通信成本小…

【Vue】父子组件传参 孙子调用爷爷的方法 provide inject

一. 父传子 父组件先在data中定义要传给子组件的属性名父组件在中引入子组件在components中注册使用步骤 3 中注册好的子组件在 3 中&#xff0c;父传子 &#xff08;1&#xff09;利用 : 将父组件的对象、数组、字符串等传给子组件&#xff0c;供子组件使用 &#xff08;2&am…