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

Java中的线程池使用详解

文章目录

  • Java中的线程池使用详解
    • 一、引言
    • 二、线程池的创建与使用
      • 1、线程池的创建
        • 1.1、FixedThreadPool(固定大小线程池)
        • 1.2、CachedThreadPool(可缓存线程池)
        • 1.3、SingleThreadExecutor(单线程化线程池)
        • 1.4、ScheduledThreadPool(定时及周期性任务线程池)
    • 三、总结

Java中的线程池使用详解

一、引言

在Java中,线程池是一种执行器(Executor),用于在一个后台线程中执行任务。线程池的主要目的是减少在创建和销毁线程时所产生的性能开销。通过重用已经创建的线程来执行新的任务,线程池提高了程序的响应速度,并且提供了更好的系统资源管理。

二、线程池的创建与使用

在这里插入图片描述

1、线程池的创建

Java提供了多种线程池,每种线程池都有其特定的使用场景。以下是几种常用的线程池及其创建方式:

1.1、FixedThreadPool(固定大小线程池)

适用于负载相对平稳的场景,线程数量固定,不会频繁地创建和销毁线程,效率较高。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FixedThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) {Runnable worker = new WorkerThread("" + i);executor.execute(worker);}executor.shutdown();while (!executor.isTerminated()) {}System.out.println("所有任务已完成");}
}class WorkerThread implements Runnable {private String command;WorkerThread(String s) {this.command = s;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 开始. 命令 = " + command);processCommand();System.out.println(Thread.currentThread().getName() + " 结束.");}private void processCommand() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic String toString() {return this.command;}
}
1.2、CachedThreadPool(可缓存线程池)

根据需要创建新线程,但如果之前创建的线程可用,就会重用它们。适合于任务数量动态变化的场景。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CachedThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int taskId = i;executor.execute(() -> {System.out.println("Task " + taskId + " is executing by " + Thread.currentThread().getName());try {Thread.sleep(2000); // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " completed.");});}executor.shutdown();}
}
1.3、SingleThreadExecutor(单线程化线程池)

只有一个线程在工作,保证了所有任务都在同一个线程按顺序执行,适用于需要保证执行顺序的场景。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SingleThreadExecutorExample {public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();for (int i = 0; i < 10; i++) {Runnable task = new Task(i);executorService.execute(task);}executorService.shutdown();}
}class Task implements Runnable {private final int taskId;public Task(int taskId) {this.taskId = taskId;}@Overridepublic void run() {System.out.println("Executing task " + taskId + " by " + Thread.currentThread().getName());}
}
1.4、ScheduledThreadPool(定时及周期性任务线程池)

特别适合需要执行定时或周期性任务的场景。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample {public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);Runnable task = new Task(1);scheduledExecutorService.schedule(task, 5, TimeUnit.SECONDS);scheduledExecutorService.shutdown();}
}class Task implements Runnable {private final int taskId;public Task(int taskId) {this.taskId = taskId;}@Overridepublic void run() {System.out.println("Executing task " + taskId + " by " + Thread.currentThread().getName());}
}

三、总结

线程池是Java并发编程中的一个重要组件,它不仅提高了程序性能,还帮助我们更好地管理线程资源。通过合理选择和使用线程池,我们可以构建出高效、稳定的并发应用程序。理解不同线程池的特点和适用场景,能够帮助我们更好地设计和优化系统架构。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • 11 java 线程池 使用实例 - yweihainan
  • Java线程池的使用和最佳实践
  • Java 多线程:彻底搞懂线程池_java线程池-CSDN博客
  • java线程池详解及五种线程池方法详解_java 线程池-CSDN博客
  • 如何在 Java 8 中创建和使用线程池?-阿里云开发者社区
  • Java中的线程池(附有代码示例)_java线程池代码示例-CSDN博客

相关文章:

Java中的线程池使用详解

文章目录 Java中的线程池使用详解一、引言二、线程池的创建与使用1、线程池的创建1.1、FixedThreadPool&#xff08;固定大小线程池&#xff09;1.2、CachedThreadPool&#xff08;可缓存线程池&#xff09;1.3、SingleThreadExecutor&#xff08;单线程化线程池&#xff09;1.…...

Redis(概念、IO模型、多路选择算法、安装和启停)

一、概念 关系型数据库是典型的行存储数据库&#xff0c;存在的问题是&#xff0c;按行存储的数据在物理层面占用的是连续存储空间&#xff0c;不适合海量数据存储。 Redis在生产中使用的最多的是用作数据缓存。 服务器先在缓存中查询数据&#xff0c;查到则返回&#xff0c;…...

计算机网络 第4章 网络层

计算机网络 &#xff08;第八版&#xff09;谢希仁 第 4 章 网络层4.2.2 IP地址**无分类编址CIDR**IP地址的特点 4.2.3 IP地址与MAC地址4.2.4 ARP 地址解析协议4.2.5 IP数据报的格式题目2&#xff1a;IP数据报分片与重组题目&#xff1a;计算IP数据报的首部校验和(不正确未改) …...

Java学习笔记--继承方法的重写介绍,重写方法的注意事项,方法重写的使用场景,super和this

目录 一&#xff0c;方法的重写 二&#xff0c;重写方法的注意事项 三&#xff0c;方法重写的使用场景 四&#xff0c;super和this 1.继承中构造方法的特点 2.super和this的具体使用 super的具体使用 this的具体使用 一&#xff0c;方法的重写 1.概述:子类中有一个和父类…...

高级java每日一道面试题-2024年11月27日-JVM篇-JVM的永久代中会发生垃圾回收么?

如果有遗漏,评论区告诉我进行补充 面试官: JVM的永久代中会发生垃圾回收么? 我回答: 在Java虚拟机&#xff08;JVM&#xff09;的历史版本中&#xff0c;确实存在一个称为“永久代”&#xff08;Permanent Generation, 或者简称PermGen&#xff09;的内存区域。永久代主要用…...

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表&#xff08;或依赖下拉列表&#xff09;的概念令人兴奋&#xff0c;但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框&#xff0c;分别显示…...

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理&#xff08;一&#xff09;A*算法原理&#xff08;二&#xff09;人工蜂群算法原理&#xff08;三&#xff09;混合ABC和A*算法策略 三、代码实现&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;关键函数实现…...

狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程

Mac分享吧 文章目录 狂野飙车8(Asphalt 8) for Mac 赛车竞速游戏软件 效果图展示一、狂野飙车8(Asphalt 8) 赛车竞速游戏 Mac电脑版——v2.1.11️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件2.1 左侧安装包拖入右侧文件夹中&#xff0c;等待安装完成&#xff0c;运行软件…...

网络技术-VRRP(虚拟路由冗余协议)部署介绍

一、VRRP的含义 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;是一种高度可靠的路由器备用协议&#xff0c;用于在局域网内部提供路由器冗余。 其部署方式主要是通过多个路由器组成一个虚拟路由器组&#xff0c;通过协议选…...

C语言解决空瓶换水问题:高效算法与实现

标题&#xff1a;C语言解决空瓶换水问题&#xff1a;高效算法与实现 一、问题描述 在一个饮料促销活动中&#xff0c;你可以通过空瓶换水的方式免费获得更多的水&#xff1a;3个空瓶可以换1瓶水。喝完这瓶水后&#xff0c;空瓶会再次变为空瓶。假设你最初拥有一定数量的空瓶&a…...

day2全局注册

全局注册代码&#xff1a; //文件核心作用&#xff1a;导入App.vue,基于App.vue创建结构渲染index.htmlimport Vue from vue import App from ./App.vue //编写导入的代码&#xff0c;往代码的顶部编写&#xff08;规范&#xff09; import HmButton from ./components/Hm-But…...

鸿蒙多线程应用-taskPool

并发模型 并发模型是用来实现不同应用场景中并发任务的编程模型&#xff0c;常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。 Actor并发模型作为基于消息通信并发模型的典型代表&#xff0c;不需要开发者去面对锁带来的一系列复杂偶发的问题&#xff0c;同…...

【失败经验】将算法模型封装为安卓应用

背景&#xff1a;不懂安卓开发&#xff0c;希望能使用大模型编码完成安卓应用生成&#xff0c;调用算法模型进行预测。 模型准备&#xff1a; pip方案安装pcnn&#xff1b; 然后需要将pytorch训练完成的算法模型保存为torchscript模型&#xff0c;然后使用pcnn转换为ncnn的模…...

ABAP OOALV模板

自用模板&#xff0c;可能存在问题 一、主程序 *&---------------------------------------------------------------------* *& Report ZVIA_OO_ALV *&---------------------------------------------------------------------* REPORT ZVIA_OO_ALV.INCLUDE ZVI…...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-autobatch.py

autobatch.py ultralytics\utils\autobatch.py 目录 autobatch.py 1.所需的库和模块 2.def check_train_batch_size(model, imgsz640, ampTrue, batch-1): 3.def autobatch(model, imgsz640, fraction0.60, batch_sizeDEFAULT_CFG.batch): 1.所需的库和模块 # Ultraly…...

SycoTec 4060 ER-S德国高精密主轴电机如何支持模具的自动化加工?

SycoTec 4060 ER-S高速电主轴在模具自动化加工中的支持体现在以下几个关键方面&#xff1a; 1.高精度与稳定性&#xff1a;SycoTec 4060 ER-S锥面跳动小于1微米&#xff0c;确保了加工过程中的极高精度&#xff0c;这对于模具的复杂几何形状和严格公差要求至关重要。高精度加工…...

部署 DeepSpeed以推理 defog/sqlcoder-70b-alpha 模型

部署 DeepSpeed 以推理 defog/sqlcoder-70b-alpha 这样的 70B 模型是一个复杂的过程&#xff0c;涉及多个关键步骤。下面是详细的步骤&#xff0c;涵盖了从模型加载、内存优化到加速推理的全过程。 1. 准备环境 确保你的环境配置正确&#xff0c;以便能够顺利部署 defog/sqlc…...

Python网络爬虫基础

Python网络爬虫是一种自动化工具&#xff0c;用于从互联网上抓取信息。它通过模拟人类浏览网页的行为&#xff0c;自动地访问网站并提取所需的数据。网络爬虫在数据挖掘、搜索引擎优化、市场研究等多个领域都有广泛的应用。以下是Python网络爬虫的一些基本概念&#xff1a; 1.…...

每天五分钟机器学习:支持向量机数学基础之超平面分离定理

本文重点 超平面分离定理(Separating Hyperplane Theorem)是数学和机器学习领域中的一个重要概念,特别是在凸集理论和最优化理论中有着广泛的应用。该定理表明,在特定的条件下,两个不相交的凸集总可以用一个超平面进行分离。 定义与表述 超平面分离定理(Separating Hy…...

TCP/IP网络协议栈

TCP/IP网络协议栈是一个分层的网络模型&#xff0c;用于在互联网和其他网络中传输数据。它由几个关键的协议层组成&#xff0c;每一层负责特定的功能。以下是对TCP/IP协议栈的简要介绍&#xff1a; TCP/IP协议模型的分层 1. 应用层&#xff08;Application Layer&#xff09;…...

电力系统网络安全:从风险认知到威胁建模的实战指南

1. 从日常运维到风险认知&#xff1a;重新审视大容量电力系统的安全基线在能源行业干了十几年&#xff0c;我见过太多同行把大容量电力系统&#xff08;Bulk Energy System, BES&#xff09;的运维简化为“确保别停电”。日常的告警处理、设备巡检、工单流转构成了工作的全部叙…...

NVIDIA aicr:AI容器运行时核心原理与生产部署指南

1. 项目概述&#xff1a;当AI遇见容器运行时如果你在AI开发或者高性能计算领域摸爬滚打过一段时间&#xff0c;大概率会遇到一个让人头疼的问题&#xff1a;如何高效、稳定地管理那些“胃口”巨大、依赖复杂的AI工作负载&#xff1f;从训练一个大型语言模型到运行一个实时的计算…...

告别卡顿!用UltraISO给旧笔记本装Win10和Ubuntu双系统,从制作启动盘到分区配置完整流程

旧笔记本焕新指南&#xff1a;用UltraISO打造Win10与Ubuntu双系统全流程 每次打开那台陪伴多年的旧笔记本&#xff0c;风扇的轰鸣声和系统卡顿的转圈图标都在提醒你——是时候给它一次重生了。不同于直接更换硬件的高成本方案&#xff0c;通过双系统安装让老旧设备重获新生&…...

云原生 Kubernetes 核心概念与组件详解

目录 一、Kubernetes 是什么&#xff1f; 核心功能概览 二、部署演进&#xff1a;从物理机到容器 1. 传统部署时代 2. 虚拟化部署时代 3. 容器部署时代 三、Kubernetes 集群架构 1. 控制平面组件&#xff08;集群大脑&#xff09; &#xff08;1&#xff09;kube-apise…...

2026 流量卡办理全攻略:从下单、激活到售后,新手一遍看懂不踩坑

现在人人都离不开手机流量&#xff0c;不管是日常刷视频、追剧观影&#xff0c;还是备用机上网冲浪&#xff0c;一张划算又正规的通用流量卡&#xff0c;已经成为大众刚需。但很多新手第一次在线办理优惠号卡&#xff0c;普遍一头雾水&#xff1a;分不清流量卡是否正规靠谱、办…...

知网AI率30%50%80%哪个最难降?比话降AI知网专精方案!

知网AI率30%50%80%哪个最难降&#xff1f;比话降AI知网专精方案&#xff01; 很多硕博毕业生有个直觉&#xff1a;知网 AI 率 80% 比 30% 难降很多。这个直觉只对了一半。 真相是&#xff1a;难度不是看数字高低&#xff0c;是看「工具的技术路线对不对知网的算法」。一篇 80% …...

AD19原理图编译总报off grid pin警告?手把手教你从库源头搞定封装与栅格对齐

AD19原理图编译报off grid pin警告&#xff1f;从库源头解决封装与栅格对齐问题 每次在AD19中编译原理图时&#xff0c;看到那一长串的"off grid pin"警告&#xff0c;是不是感觉特别烦躁&#xff1f;这些看似无害的警告实际上可能隐藏着严重的设计隐患。作为一位经历…...

Docker Hub命令行工具hub-tool:镜像仓库自动化管理的终极利器

1. 项目概述&#xff1a;一个被低估的Docker Hub命令行利器 如果你日常工作中需要和Docker Hub打交道&#xff0c;无论是管理个人镜像、处理团队仓库&#xff0c;还是需要自动化镜像的推送、拉取和清理&#xff0c;那么你很可能已经受够了在浏览器和命令行之间反复横跳的繁琐。…...

Simulink模块搭建跟踪误差不归零?可能是隐藏的信号延迟在捣鬼(附S函数解法)

Simulink隐性信号延迟&#xff1a;从图形化建模到S函数的高精度控制实践 在控制系统仿真领域&#xff0c;Simulink作为行业标准工具链的核心组件&#xff0c;其图形化建模方式极大降低了算法验证的门槛。但当工程师从功能实现进阶到性能优化阶段时&#xff0c;常常会遇到一个令…...

别再手动算归一化了!用Origin9.1的‘列公式’功能一键搞定数据预处理

用Origin9.1列公式功能高效实现数据归一化&#xff1a;从原理到实战 科研数据处理中&#xff0c;归一化是消除量纲影响、提升分析结果可比性的关键步骤。传统手动计算不仅耗时费力&#xff0c;还容易因公式输入错误导致结果偏差。Origin9.1的"列公式"功能&#xff08…...