Java修炼(线程池) 2024.7.26 16:38

目录

  • 引入
  • 什么是线程池?
  • 工作原理
  • 线程池的类型
  • 线程池的优势
  • 使用线程池的基本步骤
  • 示例代码
  • 真实应用场景

引入

线程池并发编程中的一个重要概念,广泛应用于 Java 和其他编程语言中。下面我将全面地复习线程池的概念、工作原理、类型、优势以及在 Java 中的实现。

什么是线程池?

线程池是一种设计模式,它通过维护一个线程集合来管理多个线程。线程池允许多个线程同时执行任务,而无需为每个任务单独创建和销毁线程。线程池的主要目的是为了提高应用程序的性能和资源的管理效率

工作原理

1.任务提交:用户通过一个接口提交任务,通常是实现 RunnableCallable 接口的对象。

2.任务排队:提交的任务被存放在一个任务队列中,等待线程池中的空闲线程去执行。

3.线程执行任务:如果线程池中有空闲线程,它会从队列中取出任务并执行。如果没有,则任务会被等到有线程空闲为止。

4.线程复用:线程池中的线程在任务完成后不会被销毁,而是被复用执行后续的任务,这样可以减少线程创建和销毁的开销。

5.关闭线程池:线程池在不再需要时可以被关闭,释放掉所占用的资源。

线程池的类型

在 Java 中,主要有以下几种类型的线程池,由 Executors 类提供:
1.固定大小线程池

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(n);

固定大小的线程池,池中的线程数固定为 n。

2.可缓存线程池

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

它会根据需要创建新线程,无限制地增加线程数。空闲线程在 60 秒后会被回收

3.单线程池

ExecutorService singleThreadPool =Executors.newSingleThreadExecutor();

只有一个线程,可以保证任务按顺序执行。

4.定时任务线程池

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(n);

可以用于执行定时任务或周期性任务。

线程池的优势

1.提高性能:通过复用线程,减少了频繁创建和销毁线程带来的性能损耗。

2.控制并发:线程池允许你控制并发的线程数量,避免因过多的线程导致系统资源耗尽。

3.降低资源消耗:减少了系统资源(如内存和 CPU 时间)的消耗。

4.任务管理:提供了对任务的管理,包括任务的调度、优先级管理等。

使用线程池的基本步骤

1.创建线程池。
2.提交任务到线程池。
3.关闭线程池(可选)。

示例代码

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 提交多个任务for (int i = 0; i < 10; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Executing Task " + taskId + " by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 关闭线程池executor.shutdown();}
}

真实应用场景

Web 服务器:处理多个并发的 HTTP 请求。
定时任务:定期执行的后台任务。
大规模并行计算:处理需要同时执行多个任务的计算。
任何高并发要求的应用:如消息队列的消费。

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

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

相关文章

AI 正在取代工作岗位、ChatBot 进入厌倦期、向量数据库崛起,人工智能现状报告有这些重要发现!...

作者 | Echo Tang&GPT 出品丨AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 百度的无人驾驶“萝卜快跑”已经在武汉大面积推广&#xff0c;在部分城市进行小量的试运行&#xff0c;以低廉的价格直接卷翻滴滴、出租车司机&#xff0c;让人们热议“五年、十…

git报错403,git项目拉取不下来

解决办法&#xff0c;清除以下配置 https://blog.csdn.net/weixin_55047679/article/details/131763419 清除后再次拉取代码时&#xff0c;重新输入云效平台https用户账号及密码

Linux 使用技巧及示例

1. 快速切换目录 技巧: 使用别名来快速切换到常用的目录。示例:# 添加到 ~/.bashrc 文件 echo alias myproject"cd /home/user/Projects/my_project" >> ~/.bashrc source ~/.bashrc # 重新加载配置文件使其生效2. 管道和重定向 技巧: 使用管道 (|) 和重定向…

7月23日JavaSE学习笔记

异常&#xff1a; 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类&#xff08;可抛出的&#xff09; Throwable继承树 Error&#xff1a;错误/事故&#xff0c;Java程序无法处理&#xff0c;如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

Spring 微服务提示:使用环境变量抽象数据库主机名

安全地管理任何微服务的数据库连接字符串都至关重要;通常&#xff0c;我们使用环境变量来保护用户名和密码&#xff0c;并且从不考虑屏蔽或隐藏数据库主机名。在读取器和写入器数据库实例中&#xff0c;某些组织会强制要求在应用程序启动期间不要泄露主机名并通过环境变量传递主…

sklearn详细基础教程(科普篇)

Scikit-learn&#xff08;简称sklearn&#xff09;是Python中一个强大且易于使用的机器学习库&#xff0c;它基于NumPy、SciPy和matplotlib等Python库构建&#xff0c;提供了丰富的工具集&#xff0c;包括数据预处理、特征选择、模型训练、评估和预测等功能。以下是sklearn的详…

研0 冲刺算法竞赛 day22 P1928 外星密码

P1928 外星密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;递归处理&#xff0c;分类处理 代码&#xff1a; #include<iostream> #include<stack> using namespace std; #include <cstring> char copl[20005];string handle() {int …

使用Java和Spring AMQP构建消息驱动应用

使用Java和Spring AMQP构建消息驱动应用 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 消息驱动应用程序在现代系统架构中扮演着重要角色&#xff0c;特别是在处理高并发和异步任务时。Spring AMQ…

【笔记-软考】层次式架构-表现层框架设计

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-27 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 设计模式 表现层设计模式主要包括MVC、MVP、MVVM三种&#xff0c;用来分离显示部分和业务处理部分&#xff08;显示部分发生变化的概…

LeetCode209 长度最小的子数组

前言 题目&#xff1a; 209.长度最小的子数组 文档&#xff1a; 代码随想录——长度最小的子数组 编程语言&#xff1a; C 解题状态&#xff1a; 没有思路&#xff0c;暴力解法都没思路… 思路 注意&#xff0c;子数组指的是连续子数组&#xff0c;不然本题就没有意义了。 代…

全网最详细!! Linux 安装、配置教程

一、下载安装包 首先去官网下载VMware最新版本&#xff0c;以及发行版CentOS -7&#xff0c;懒得下载的可以私信我&#xff0c;我给你发包 其中&#xff0c;CentOS&#xff08;Community Enterprise Operating System&#xff09;是一个基于Linux的开源操作系统&#xff0c;它是…

【日常记录-Docker】容器退出机制

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-25 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 Docker容器退出机制是指容器停止运行并退出的一系列行为与规则&#xff0c;其决定了容器何时以及如何停止运行。了解并掌握容器…

华为OD机试 - 停车场车辆统计 - 贪心算法(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华…

小米8 刷 澎湃OS 面具 插件优化调度教程

参考&#xff1a;文档: https://topjohnwu.github.io/Magisk/ 官方地址: https://github.com/topjohnwu/Magisk/releases lsposed: https://github.com/LSPosed/LSPosed Shamiko: https://github.com/LSPosed/LSPosed.github.io/releases 小米8 移植版 澎湃OS1.0.2 MI8_Dippe…

微服务注册中心

目录 1.微服务的注册中心 1.1 注册中⼼的主要作⽤ 1.2 常⻅的注册中⼼ 2.nacos简介 2.1 nacos实战⼊⻔ 2.2.1 搭建nacos环境 2.2.2 将商品微服务注册到nacos 3.服务调⽤Ribbon⼊⻔ 3.1 Ribbon概述 3.1.1 什么是Ribbon 3.1.2 Ribbon的主要作⽤ 3.2.2 ⼯程改造 4.服务…

TIM定时器输入捕获

TIM定时器输入捕获 文章目录 TIM定时器输入捕获1. 输入捕获1. 输入捕获的工作原理2. 输入捕获的应用场景 2.输入捕获配置流程测量频率和占空比的函数 1. 输入捕获 输入捕获是STM32定时器的一项重要功能&#xff0c;它允许微控制器捕捉外部信号的变化&#xff08;通常是边沿变化…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器&#xff1a; 搭建DNS多区域功能&#xff08;Multi-Zone DNS&#xff09;主要是为了满足复杂网络环境下的多样化需求&#xff0c;提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境&#xff1a; 在大型组织、跨国公司或跨地域服务中&#xff0c;网…

大模型学习笔记 - LLM指令微调

LLM 指令微调 LLM 指令微调 0. 概览1. 指令数据的构建 1.1 基于现有NLP任务数据集构建1.2 基于日常对话数据构建1.3 基于合成数据构建1.4 指令数据构建的提升方法 2. 指令微调的策略 2.1 优化设置2.2 数据组织策略 3. 参数高效的模型微调 3.1 低秩适配微调方法3.2 其他高效微调…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

Angular 18.2.0 的新功能增强和创新

一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台&#xff0c;最近发布了 18.2.0 版本。此更新带来了许多新功能和改进&#xff0c;进一步增强了其功能和开发人员体验。在本文中&#xff0c;我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…