当前位置: 首页 > news >正文

四种线程池的使用,优缺点分析

池化思想:线程池、字符串常量池、数据库连接池
提高资源的利用率
下面是手动创建线程和执行任务过程,可见挺麻烦的,而且线程利用率不高。

  1. 手动创建线程对象
  2. 执行任务
  3. 执行完毕,释放线程对象

线程池的优点:

  • 提高线程的利用率
  • 提高程序的响应速度
  • 便于统一管理线程对象
  • 可以控制最大并发数
package chapter09;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.*;public class Java05_Thread_Pool {public static void main(String[] args) {// TODO 线程 - 线程池// 所谓线程池,其实就是线程对象的容器// 可以根据需要,在启动时,创建一个或多个线程对象// 快速创建线程池的4种比较常见的方法// 它们都是对 ThreadPoolExecutor 的封装,那必然无法满足更复杂,更需要自定义功能的需求场景// 1. 创建固定数量的线程对象//    ExecutorService是线程服务对象ExecutorService executorService = Executors.newFixedThreadPool(3);// 2. 根据需求动态创建线程, 创建的线程可以重复使用,只是当目前线程不够了他会动态增加线程executorService = Executors.newCachedThreadPool();// 3. 单一线程executorService = Executors.newSingleThreadExecutor();// 4. 定时调度线程, 线程有3个,但是线程在什么时候执行我们可以去定义他executorService = Executors.newScheduledThreadPool(3);// 使用submit提交任务for (int i = 0; i < 5; i++) {executorService.submit(new Runnable() {@Overridepublic void run() {System.out.println("submit方式 " + Thread.currentThread().getName());}});}// 使用execute提交任务for (int i = 0; i < 5; i++) {executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println("execute方式 " + Thread.currentThread().getName());}});}executorService.shutdown(); // 关闭线程池// 如果你需要更多的控制和自定义选项,使用 ThreadPoolExecutor 可以满足更复杂的需求// 使用银行柜台服务的场景来解释 ThreadPoolExecutor 的每个参数ExecutorService executorService1 = new ThreadPoolExecutor(3,  // corePoolSize-核心线程数,即银行的初始柜台数,// 具体来说:银行一开始有 3 个柜台,每个柜台有一个员工(线程)在处理客户(任务)。这些柜台是常驻的,即使没有客户时也不会关闭5,  // maximumPoolSize-最大线程数,即银行在高峰期能开设的最大柜台数量// 在客户数量增加的时候,银行可以最多开设 5 个柜台来处理客户。超过这个数量的客户需要排队等候1L, // keepAliveTime-非核心线程的存活时间// 如果一个临时增加的柜台(超过核心柜台数的部分)空闲了 1 秒钟,那么这个柜台就会关闭(线程会被回收)。// 这就像银行在高峰期增加了柜台,但在高峰期过后,临时柜台会在短时间内关闭,以节省资源TimeUnit.SECONDS, // keepAliveTime's unit-存活时间的单位// 这里的单位是秒,表示非核心线程在空闲 1 秒后会被关闭,跟上面的 keepAliveTime 配合使用new ArrayBlockingQueue<>(3), // workQueue-等待队列,用于存放等待处理的任务// 假如银行有一个容量为 3 的等候区(队列),当所有柜台都在忙碌时,新的客户会在这个等候区等待。// 如果等候区也满了,那么将会触发下面handler的策略(下面是 拒绝策略)Executors.defaultThreadFactory(), // threadFactory-线程工厂,用于创建新线程// 这是一个工厂模式,负责为银行创建新的柜台(线程)。// Executors.defaultThreadFactory() 是默认的实现,它会创建一个新的线程来处理任务。new ThreadPoolExecutor.AbortPolicy() // handler-当线程池和等待队列都满了时如何处理新任务的策略// 如果所有的柜台(线程)和等候区(队列)都满了,再来新的客户时会执行拒绝策略。// AbortPolicy 会抛出 RejectedExecutionException,就像银行告诉新来的客户“我们现在无法处理您的请求,请稍后再试”。);/*ExecutorService类对象可以使用两种方法向线程池提交任务:submit 和 execute。execute 方法用于提交不需要返回结果的任务。它是 Executor 接口中的方法返回类型: void。execute 方法不返回任何结果。异常处理: 如果任务在执行过程中抛出未经检查的异常,该异常将直接传播到调用者所在的线程。适用场景: 适用于不需要返回结果的任务,比如简单的异步执行任务。submit 方法用于提交有返回结果的任务。它是 ExecutorService 接口中的方法。返回类型: Future<V>。submit 方法返回一个 Future 对象,可以通过该对象获取任务的执行结果或取消任务。异常处理: 如果任务在执行过程中抛出未经检查的异常,该异常将被捕获,并存储在返回的 Future 对象中。调用 Future.get() 方法时,会抛出 ExecutionException。适用场景: 适用于需要返回结果的任务,比如计算任务,或者你需要检查任务是否成功完成。通过这两种方法,你可以根据任务的具体需求来选择合适的提交方式。如果任务需要返回结果或需要检查执行状态,使用 submit;如果任务只是执行,不需要返回结果,使用 execute。*/List<Future<Integer>> futureList = new ArrayList<>();// 使用submit提交任务,并且改变需要执行的Runnable任务来看看线程池有什么变化情况// 任务数i在6个以内,executorService1指向的线程池只开3个线程// 7个任务开四个线程, 8个任务开五个线程// 9个任务直接 Exception in thread "main" java.util.concurrent.RejectedExecutionException// 解释:// 3个任务:直接全部给到三个核心线程处理// 4~6个任务:三个核心线程处理其中3个任务,剩下的任务进入等待队列// 7个任务:三个核心线程处理其中3个任务,等待队列存放3个任务,那还剩下1个任务就交给非核心线程处理(增设了一个额外的线程)// 8个任务:三个核心线程处理其中3个任务,等待队列存放3个任务,那还剩下2个任务就交给两个非核心线程处理(增设了两个额外的线程)// 9个任务:三个核心线程处理其中3个任务,等待队列存放3个任务,那还剩下3个任务,但是最大线程数是5个,// 也就是说再多只能在三个核心线程的基础上再增设两个额外的线程,但是也不够处理剩下的3个任务// 或者说 最大线程数大小 5 + 等待队列大小 3 = 8 < 任务所需的线程数 9for (int i = 1; i <= 3; i++) {int taskId = i;Future<Integer> future = executorService1.submit(new Callable() {@Overridepublic Integer call() {System.out.println(Thread.currentThread().getName() + "正在处理业务" + taskId);return taskId;}});futureList.add(future);}Iterator<Future<Integer>> it = futureList.iterator();while (it.hasNext()) {Future<Integer> future = it.next();try {Integer result = future.get();System.out.println("Result: " + result);} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}// 使用execute方式提交任务for (int i = 1; i <= 9; i++) {int taskId = i;executorService1.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在处理业务" + taskId);}});}}
}

相关文章:

四种线程池的使用,优缺点分析

池化思想&#xff1a;线程池、字符串常量池、数据库连接池 提高资源的利用率 下面是手动创建线程和执行任务过程&#xff0c;可见挺麻烦的&#xff0c;而且线程利用率不高。 手动创建线程对象执行任务执行完毕&#xff0c;释放线程对象 线程池的优点&#xff1a; 提高线程的…...

什么是 BEM 规范

BEM&#xff08;Block, Element, Modifier&#xff09;是一种 CSS 命名规范&#xff0c;旨在提高代码的可读性和可维护性。BEM 规范通过明确的命名规则来定义组件和组件的各个部分&#xff0c;使开发者能够更容易地理解和维护代码。 BEM 命名规范的基本概念 Block&#xff08…...

【Node.JS】入门

文章目录 Node.js的入门涉及对其基本概念、特点、安装、以及基本使用方法的了解。以下是对Node.js入门的详细介绍&#xff1a; 一、Node.js基本概念和特点 定义&#xff1a;Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它使得JavaScript能够运行在服务器…...

Amazon SageMaker 机器学习之旅的助推器

一、前言 在当今的数字化时代&#xff0c;人工智能和机器学习已经成为推动社会进步的重要引擎。亚马逊云科技在 2023 re:Invent 全球大会上&#xff0c;宣布推出五项 Amazon SageMaker 新功能&#xff1a; Amazon SageMaker HyperPod 通过为大规模分布式训练提供专用的基础架构…...

TransMIL:基于Transformer的多实例学习

MIL是弱监督分类问题的有力工具。然而&#xff0c;目前的MIL方法通常基于iid假设&#xff0c;忽略了不同实例之间的相关性。为了解决这个问题&#xff0c;作者提出了一个新的框架&#xff0c;称为相关性MIL&#xff0c;并提供了收敛性的证明。基于此框架&#xff0c;还设计了一…...

3.用户程序与驱动交互

驱动程序请使用第二章https://blog.csdn.net/chenhequanlalala/article/details/140034424 用户app与驱动交互最常见的做法是insmod驱动后&#xff0c;生成一个设备节点&#xff0c;app通过open&#xff0c;read等系统调用去操作这个设备节点&#xff0c;这里先用mknode命令调…...

尽量不写一行if...elseif...写出高质量可持续迭代的项目代码

背景 无论是前端代码还是后端代码&#xff0c;都存在着定位困难&#xff0c;不好抽离&#xff0c;改造困难的问题&#xff0c;造成代码开发越来越慢&#xff0c;此外因为代码耦合较高&#xff0c;总是出现改了一处地方&#xff0c;然后影响其他地方&#xff0c;要么就是要修改…...

xcrun: error: unable to find utility “simctl“, not a developer tool or in PATH

目录 前言 一、问题详情 二、解决方案 1.确认Xcode已安装 2.安装Xcode命令行工具 3.指定正确的开发者目录 4. 确认命令行工具路径 5. 更新PATH环境变量 前言 今天使用cocoapods更新私有库的时候&#xff0c;遇到了"xcrun: error: unable to find utility &…...

【linux高级IO(一)】理解五种IO模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 重谈对…...

前端引用vue/element/echarts资源等引用方法Blob下载HTML

前端引用下载vue/element/echarts资源等引用方法 功能需求 需求是在HTML页面中集成Vue.js、Element Plus&#xff08;Element UI的Vue 3版本&#xff09;、ECharts等前端资源&#xff0c;使用Blob下载HTML。 解决方案概述 直接访问线上CDN地址&#xff1a;简单直接&#xff0c…...

昇思MindSpore学习笔记2-01 LLM原理和实践 --基于 MindSpore 实现 BERT 对话情绪识别

摘要&#xff1a; 通过识别BERT对话情绪状态的实例&#xff0c;展现在昇思MindSpore AI框架中大语言模型的原理和实际使用方法、步骤。 一、环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下…...

uniapp实现图片懒加载 封装组件

想要的效果就是窗口滑动到哪里&#xff0c;哪里的图片进行展示 主要原理使用IntersectionObserver <template><view><image error"HandlerError" :style"imgStyle" :src"imageSrc" :id"randomId" :mode"mode&quo…...

持续交付:自动化测试与发布流程的变革

目录 前言1. 持续交付的概念1.1 持续交付的定义1.2 持续交付的核心原则 2. 持续交付的优势2.1 提高交付速度2.2 提高软件质量2.3 降低发布风险2.4 提高团队协作 3. 实施持续交付的步骤3.1 构建自动化测试体系3.1.1 单元测试3.1.2 集成测试3.1.3 功能测试3.1.4 性能测试 3.2 构建…...

VBA常用的字符串内置函数

前言 在VBA程序中&#xff0c;常用的内置函数可以按照功能分为字符串函数、数字函数、转换函数等等&#xff0c;本节主要会介绍常用的字符串的内置函数&#xff0c;包括Len()、Left()、Mid()、Right()、Split()、String()、StrConV()等。 本节的练习数据表以下表为例&#xff…...

大数据面试题之Spark(7)

目录 Spark实现wordcount Spark Streaming怎么实现数据持久化保存? Spark SQL读取文件&#xff0c;内存不够使用&#xff0c;如何处理? Spark的lazy体现在哪里? Spark中的并行度等于什么 Spark运行时并行度的设署 Spark SQL的数据倾斜 Spark的exactly-once Spark的…...

AI绘画 Stable Diffusion图像的脸部细节控制——采样器全解析

大家好&#xff0c;我是画画的小强 我们在运用AI绘画 Stable Diffusion 这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己对提示词的使用还不够充分。在这种情形下&#xff0c;我们应当如何调整自己的策略&#xff0c;以便更加精确、全面地塑造出理想的人物形象呢&a…...

liunx离线安装Firefox

在Linux系统中离线安装Firefox浏览器&#xff0c;您需要先从Mozilla的官方网站下载Firefox的安装包&#xff0c;然后通过终端进行安装。以下是详细的步骤&#xff1a; 准备工作 下载Firefox安装包&#xff1a; 首先&#xff0c;在一台可以上网的电脑上访问Firefox官方下载页面…...

UNet进行病理图像分割

数据集链接&#xff1a;https://pan.baidu.com/s/1IBe_P0AyHgZC39NqzOxZhA?pwdnztc 提取码&#xff1a;nztc UNet模型 import torch import torch.nn as nnclass conv_block(nn.Module):def __init__(self, ch_in, ch_out):super(conv_block, self).__init__()self.conv nn…...

初二数学基础差从哪开始补?附深度解析!

有时候&#xff0c;当你推不开一扇门的时候&#xff0c;不要着急&#xff0c;试着反方向拉一下&#xff0c;或者横向拉一下。下面是小偏整理的初二数学基础差从哪开始补2021年&#xff0c;感谢您的每一次阅读。   初二数学基础差从哪开始补2021年   第一个问题是很多同学都…...

【C语言】return 关键字

在C语言中&#xff0c;return是一个关键字&#xff0c;用于从函数中返回值或者结束函数的执行。它是函数的重要组成部分&#xff0c;负责将函数的计算结果返回给调用者&#xff0c;并可以提前终止函数的执行。 主要用途和原理&#xff1a; 返回值给调用者&#xff1a; 当函数执…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...