JavaEE——线程池

目录

  • 前言
  • 1. 概念
  • 2. 线程池相关参数
  • 3. Executors的使用
  • 总结

前言

线程是为了解决进程太重的问题,操作系统中进程的创建和销毁需要较多的系统资源,用了轻量级的线程来代替部分线程,但是如果线程创建和销毁的频率也开始提升到了一定程度,系统的开销同样也不可忽视了,为了解决这种问题,我们使用了线程池进行优化。本篇文章就主要来讲讲线程池。

1. 概念

我们提前把线程创建好,放到一个”池子“里,这就构成了一个线程池,我们在申请线程时,直接从这个所谓的池子里取,用完了之后再放回去,这就是线程池的基本思想,很好的减小了创建和销毁的线程的开销。

2. 线程池相关参数

这里主要介绍一下线程池构造方法中的相关参数。
Java中提供了线程池的类:ThreadPoolExecutor,在创建这个类的实例时,有很多参数,这里来简要介绍一下:

在这里插入图片描述
官方文档中,有这四种构造方式,我们介绍第四个,其中包含了前三个的参数。
在这里插入图片描述
我们先看前两个参数:
在这里插入图片描述
第一个表示核心线程数,第二个表示总数。
在Java的线程池中,把线程分为两种:核心线程和临时线程,一创建就申请的线程是核心线程,将任务交给核心线程。若核心线程被占用满,处理不过来,就会申请一些临时的线程来进行“协助”,当空闲下来时,这些临时线程被释放,但是核心线程不会被释放。
接下来看:
在这里插入图片描述
这里第一个表示线程的存活时间,第二个表示时间单位。
通过这两个参数,来设定临时线程的存活时间。

接下来:
在这里插入图片描述
这里的参数是一个阻塞队列,存放着线程池的任务队列, 线程池就是从这个队列中取出任务,分配给其创建的线程。

继续看下一个参数:
在这里插入图片描述
这是一个线程工厂,这里的线程工厂使用了工厂设计模式,这是众多设计模式中很常见的一种,工厂模式用于弥补构造方法里存在的缺陷,比如说在创建多个构造方法的时候,如果参数的数量一致,那么参数的类型需要不同,但是实际中常常需要上述创建这种情况的构造方法,这里的参数含义不同,但是类型和数量却是一致,这样构造会编译出错。
所以为了解决这种问题,我们就引用了工厂设计模式,在这个设计模式里,我们不用构造方法来初始化对象,使用静态方法来初始化对象,即创建一个工厂类,在里面构造静态方法,来间接的达到创建对象的目的。
回到线程工厂,我们使用这个线程工厂,则是用来对线程池所创建出来的线程进行初始化的设定。

下面看最后一个参数:
在这里插入图片描述
此参数叫做拒绝策略,当线程池的任务队列满的时候,如果再次添加新任务,则会根据给出的拒绝策略来进行处理,文档提供了四种拒绝策略。
在这里插入图片描述
第一个叫做直接终止,即抛出异常,终止程序。
第二个是让调用者自己来执行任务。
第三个是丢弃队列中最老任务。
第四个是丢弃队列中最新任务。

3. Executors的使用

Executors是标准库中提供的一个线程池的简化版本,即对ThreadPoolExecutot进行了封装。
我们可以使用Executor来创建一些线程池:
在这里插入图片描述
可以看到这里有各种各样的线程池。
下面介绍四个常用的:

    public static void main(String[] args) {//固定线程数目的线程池,核心线程和最大线程数都是4ExecutorService service =  Executors.newFixedThreadPool(4);//核心线程数为0,最大线程数为Integer.MAX_VALUE的线程池ExecutorService service2 =  Executors.newCachedThreadPool();// 只有一个线程的线程池,核心线程数和最大线程数都是1ExecutorService service3 =  Executors.newSingleThreadExecutor();// “定时器”,核心线程数为0,最大线程数为10的线程池,在这个线程池的任务可以在一定时间后执行或定期执行ExecutorService service4 =  Executors.newScheduledThreadPool(10);}

一般来说我们使用最多的线程池是前两个,接下来展示如何添加任务:

        for (int i = 0; i < 100; i++) {int id = i;service.submit( new Runnable(){@Overridepublic void run() {System.out.println("线程池中的线程正在执行任务" + id);}});}

运行效果:
在这里插入图片描述

总结

以上是对线程池的一些基本介绍,希望能够让大家了解Java中线程池各参数的作用并且能够使用Executors创建常见的线程池。

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

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

相关文章

3 c++提高——STL常用容器(一)

目录 1 string容器 1.1 string基本概念 1.2 string构造函数 1.3 string赋值操作 1.4 string字符串拼接 1.5 string查找和替换 1.6 string字符串比较 1.7 string字符存取 1.8 string插入和删除 1.9 string子串 2 vector容器 2.1 vector基本概念 2.2 vector构造函数…

手把手教你用【Go】语言调用DeepSeek大模型

1、首先呢&#xff0c;点击 “DeepSeek”” 这个&#xff0c; 可以充1块玩玩。 2、然后获取api-key 3、替换apiKey const (apiURL "https://api.deepseek.com/v1/chat/completions"apiKey "your api key" // 替换为你的实际 API KeymodelName &…

自动化UI测试工具TestComplete的核心功能及应用

对桌面应用稳定性与用户体验的挑战&#xff0c;手动测试效率低、覆盖有限&#xff0c;而普通自动化工具常难以应对复杂控件识别、脚本灵活性和大规模并行测试的需求。 自动化UI测试工具TestComplete凭借卓越的对象识别能力、灵活的测试创建方式以及高效的跨平台并行执行功能&a…

【C/C++】迈出编译第一步——预处理

【C/C】迈出编译第一步——预处理 在C/C编译流程中&#xff0c;预处理&#xff08;Preprocessing&#xff09;是第一个也是至关重要的阶段。它负责对源代码进行初步的文本替换与组织&#xff0c;使得编译器在后续阶段能正确地处理规范化的代码。预处理过程不仅影响编译效率&…

快捷键——VsCode

一键折叠所有的代码块 先按 ctrl K&#xff0c;再ctrl 0 快速注释一行 ctrl /

import 和require的区别

概念 import 是es6 规范&#xff0c;主要应用于浏览器和主流前端框架当中&#xff0c;export 导出&#xff0c; require 是 commonjs 规范&#xff0c;主要应用于nodejs环境中&#xff0c;module.exports 导出编译规则 import 静态导入是编译时解析&#xff0c;动态导入是执…

8、鸿蒙Harmony Next开发:相对布局 (RelativeContainer)

目录 概述 基本概念 设置依赖关系 设置参考边界 设置锚点 设置相对于锚点的对齐位置 子组件位置偏移 多种组件的对齐布局 组件尺寸 多个组件形成链 概述 RelativeContainer是一种采用相对布局的容器&#xff0c;支持容器内部的子元素设置相对位置关系&#xff0c;适…

Linux命令的命令历史

Linux下history命令可以对当前系统中执行过的所有shell命令进行显示。重复执行命令历史中的某个命令&#xff0c;使用&#xff1a;!命令编号&#xff1b;环境变量histsize的值保存历史命令记录的总行数&#xff1b;可用echo查看一下&#xff1b;需要大写&#xff1b;环境变量hi…

【C++小白逆袭】内存管理从崩溃到精通的秘籍

目录【C小白逆袭】内存管理从崩溃到精通的秘籍前言&#xff1a;为什么内存管理让我掉了N根头发&#xff1f;内存四区大揭秘&#xff1a;你的变量都住在哪里&#xff1f;&#x1f3e0;内存就像大学宿舍区 &#x1f3d8;️C语言的内存管理&#xff1a;手动搬砖时代 &#x1f9f1;…

【网络安全】利用 Cookie Sandwich 窃取 HttpOnly Cookie

未经许可,不得转载。 文章目录 引言Cookie 三明治原理解析Apache Tomcat 行为Python 框架行为窃取 HttpOnly 的 PHPSESSID Cookie第一步:识别 XSS 漏洞第二步:发现反射型 Cookie 参数第三步:通过 Cookie 降级实现信息泄露第四步:整合攻击流程修复建议引言 本文将介绍一种…

【工具】什么软件识别重复数字?

网上的数字统计工具虽多&#xff0c;但处理重复数字时总有点不尽如人意。 要么只能按指定格式输入&#xff0c;要么重时得手动一点点筛&#xff0c;遇上数据量多的情况&#xff0c;光是找出重复的数字就得另外花不少功夫。​ 于是我做了个重复数字统计器&#xff0c;不管是零…

CSS分层渲染与微前端2.0:解锁前端性能优化的新维度

CSS分层渲染与微前端2.0&#xff1a;解锁前端性能优化的新维度 当你的页面加载时间超过3秒&#xff0c;用户的跳出率可能飙升40%以上。这并非危言耸听&#xff0c;而是残酷的现实。在当前前端应用日益复杂、功能日益臃肿的“新常态”下&#xff0c;性能优化早已不是锦上添花的“…

AI Agent开发学习系列 - langchain之Chains的使用(5):Transformation

Transformation&#xff08;转换链&#xff09;是 LangChain 中用于“自定义数据处理”的链式工具&#xff0c;允许你在链路中插入任意 Python 代码&#xff0c;对输入或中间结果进行灵活处理。常用于&#xff1a; 对输入/输出做格式化、过滤、摘要、拆分等自定义操作作为 LLMC…

Druid 连接池使用详解

Druid 连接池使用详解 一、Druid 核心优势与架构 1. Druid 核心特性 特性说明价值监控统计内置 SQL 监控/防火墙实时查看 SQL 执行情况防 SQL 注入WallFilter 防御机制提升系统安全性加密支持数据库密码加密存储符合安全审计要求扩展性强Filter 链式架构自定义功能扩展高性能…

9.2 埃尔米特矩阵和酉矩阵

一、复向量的长度 本节的主要内容可概括为&#xff1a;当对一个复向量 z\pmb zz 或复矩阵 A\pmb AA 转置后&#xff0c;还要取复共轭。 不能在 zTz^TzT 或 ATA^TAT 时就停下来&#xff0c;还要对所有的虚部取相反的符号。对于一个分量为 zjajibjz_ja_jib_jzj​aj​ibj​ 的列向…

AI驱动的低代码革命:解构与重塑开发范式

引言&#xff1a;低代码平台的范式转移 当AI技术与低代码平台深度融合&#xff0c;软件开发正经历从"可视化编程"到"意图驱动开发"的根本性转变。这种变革不仅提升了开发效率&#xff0c;更重新定义了人与系统的交互方式。本文将从AI介入的解构层次、交互范…

zookeeper etcd区别

ZooKeeper与etcd的核心区别体现在设计理念、数据模型、一致性协议及适用场景等方面。‌ZooKeeper基于ZAB协议实现分布式协调&#xff0c;采用树形数据结构和临时节点特性&#xff0c;适合传统分布式系统&#xff1b;而etcd基于Raft协议&#xff0c;以高性能键值对存储为核心&am…

模拟注意力:少量参数放大 Attention 表征能力

论文标题 SAS: Simulated Attention Score 论文地址 https://arxiv.org/pdf/2507.07694 代码 见论文附录 作者背景 摩根士丹利&#xff0c;斯坦福大学&#xff0c;微软研究院&#xff0c;新加坡国立大学&#xff0c;得克萨斯大学奥斯汀分校&#xff0c;香港大学 动机 …

零基础|宝塔面板|frp内网穿透|esp32cam远程访问|微信小程序

1.准备好阿里云服务器和宝塔面板2.安装frp服务端3.测试(密码账号在详情里面)4.配置客户端#一、没有域名情况下 [common] server_addr #公网ip地址&#xff0c;vps server_port 7000 服务的bind_port token 12121212 [httpname] type tcp # 没有域名情况下使用 tcp local_i…

Spring Boot整合MyBatis+MySQL+Redis单表CRUD教程

Spring Boot整合MyBatisMySQLRedis单表CRUD教程 环境准备 1. Redis安装&#xff08;Windows&#xff09; # 下载Redis for Windows # 访问: https://github.com/tporadowski/redis/releases # 下载Redis-x64-5.0.14.1.msi并安装# 启动Redis服务 redis-server# 测试连接 redis-c…