Java线程池详解

线程池是用来管理和复用线程的一种技术,它避免了频繁的创建和销毁线程的开销,提高了应用程序的性能。在 Java 中,ExecutorService 是一个非常常用的接口,它提供了线程池的基本功能。

在这里插入图片描述

1. 线程池的优势

  • 线程复用:线程池管理一组固定数量的线程,任务提交时可以复用空闲线程,避免了每个任务都创建新线程的开销。
  • 减少资源消耗:线程池中有固定数量的线程,避免了频繁创建和销毁线程导致的性能损耗。
  • 控制并发数:线程池可以限制并发线程的数量,防止线程数量过多造成系统资源紧张。

2. Java 线程池的基本使用

Java 提供了 Executors 工厂类来创建常用的线程池类型。

2.1 创建线程池

常见的线程池类型:

  • 固定大小线程池:Executors.newFixedThreadPool(int nThreads)
  • 缓存线程池:Executors.newCachedThreadPool()
  • 单线程池:Executors.newSingleThreadExecutor()
  • 调度线程池:Executors.newScheduledThreadPool(int corePoolSize)
2.2 示例代码
import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小为 3 的线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 提交任务for (int i = 0; i < 5; i++) {executor.submit(new Task(i));}// 关闭线程池executor.shutdown();}static class Task implements Runnable {private int taskId;public Task(int taskId) {this.taskId = taskId;}@Overridepublic void run() {try {System.out.println("Task " + taskId + " is running on thread: " + Thread.currentThread().getName());// 模拟任务执行TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}
}
2.3 线程池的工作原理
  1. 提交任务:通过 executor.submit() 提交任务到线程池。
  2. 线程池工作:线程池中的线程会从任务队列中获取任务,并执行。
  3. 任务执行完成:执行完成后,线程会空闲,等待新的任务。
  4. 关闭线程池:调用 executor.shutdown() 可以优雅地关闭线程池,待所有任务完成后关闭。

3. 常用线程池方法

  • submit():提交一个任务并返回一个 Future 对象,可以通过 Future 获取任务执行的结果。
  • invokeAll():提交多个任务,并等待所有任务完成,返回一个 List<Future>。
  • invokeAny():提交多个任务,返回第一个执行完成的任务结果。
  • shutdown():优雅地关闭线程池,不再接收新任务,但会执行已经提交的任务。
  • shutdownNow():立即停止线程池,返回当前在执行的任务。

4. 使用 Future 获取任务结果

Future 对象代表异步计算的结果。可以通过 get() 方法获取计算结果,get() 方法会阻塞直到任务完成。

ExecutorService executor = Executors.newFixedThreadPool(2);
Future future = executor.submit(() -&gt; {// 执行任务并返回结果return 123;
});try {Integer result = future.get(); // 阻塞,直到任务完成System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}
executor.shutdown();

5. 线程池的最佳实践

  • 合理选择线程池大小:根据系统硬件配置和任务的性质来选择线程池的大小。一般来说,可以使用 CPU 核心数 * 2 作为线程池大小的参考。
  • 避免使用 Executors 静态工厂方法:Executors 的工厂方法有些存在问题,比如 newFixedThreadPool(0) 会创建一个无限大小的线程池,因此可以使用 ThreadPoolExecutor 来灵活控制线程池。
  • 手动配置 ThreadPoolExecutor:通过 ThreadPoolExecutor,你可以精细控制线程池的参数。
ExecutorService executor = new ThreadPoolExecutor(4,  // corePoolSize10, // maximumPoolSize60L, // keepAliveTimeTimeUnit.SECONDS, // unitnew LinkedBlockingQueue&lt;&gt;(), // workQueuenew ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);

总结

线程池是一个非常重要的并发编程工具,可以有效管理和复用线程,避免资源浪费,提高性能。在使用时,可以根据具体的需求选择合适的线程池类型,并掌握一些线程池的配置和优化技巧。

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

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

相关文章

软件测试—— Selenium 常用函数(二)

前一篇文章&#xff1a;软件测试—— Selenium 常用函数&#xff08;一&#xff09;-CSDN博客 目录 前言 一、浏览器 1.常见操作 &#xff08;1&#xff09;打开网站 &#xff08;2&#xff09;前进、后退、刷新 2.参数设置 &#xff08;1&#xff09;设置无头模式 &am…

webgl threejs 云渲染(服务器渲染、后端渲染)解决方案

云渲染和流式传输共享三维模型场景 1、本地无需高端GPU设备即可提供三维项目渲染 云渲染和云流化媒体都可以让3D模型共享变得简单便捷。配备强大GPU的远程服务器早就可以处理密集的处理工作&#xff0c;而专有应用程序&#xff0c;用户也可以从任何个人设备查看全保真模型并与…

springboot基于Spring Boot的古城景区管理系统的设计与实现docx

摘 要 古城景区管理系统是一个集景区导游功能于一体的综合管理平台&#xff0c;旨在提升游客的参观体验和提高管理效率。系统通过提供详尽的热门景点、客房类型、酒店信息、美食类型、特色美食、文创产品及导游服务&#xff0c;使游客能够深入了解古城的历史与文化。该系统集成…

Java list

在 Java 中&#xff0c;链表&#xff08;LinkedList&#xff09;是一个非常重要的数据结构&#xff0c;它可以动态地插入和删除元素&#xff0c;因此比数组更灵活。Java 提供了 LinkedList 类&#xff0c;该类实现了 List 接口&#xff0c;并且是基于双向链表实现的&#xff0c…

彻底理解如何保证Redis和数据库数据一致性问题

一.背景 系统中缓存最常用的策略是&#xff1a;服务端需要同时维护 DB 和 Cache 并且是以 DB 的结果为准&#xff0c;那么就可能出现 DB 和 Cache 数据不一致的问题。 二.读数据 逻辑如下&#xff1a; 当客户端发起查询数据的请求&#xff0c;首先回去Redis中查看没有没该数据&…

openwebui使用

文章目录 1、feature2、安装使用2.1 安装过程2.2 安装好后 1、feature 可以加载多个大模型 同时回复 模型问答: 使用vLLM框架部署模型&#xff0c;再使用Open WebUI直接进行模型问答 多模型支持: 多模型回复比对&#xff08;Qwen2-72B-Instruct, llama3-70b-8192, mixtral-8x7…

React Native 全栈开发实战班 - 性能与调试之打包与发布

在完成 React Native 应用的开发与性能优化后&#xff0c;下一步就是将应用打包并发布到各大应用市场&#xff0c;如 Apple App Store 和 Google Play Store。本章节将详细介绍 React Native 应用的打包与发布流程&#xff0c;包括 Android 和 iOS 平台的打包步骤、签名配置、发…

【企业级分布式系统】Ceph集群

文章目录 存储基础单机存储设备单机存储的问题商业存储解决方案分布式存储&#xff08;SDS&#xff0c;软件定义的存储&#xff09;分布式存储的类型 CephCeph的基本特点Ceph的应用场景 Ceph的架构Ceph的核心组件OSD存储引擎Ceph数据存储过程Ceph集群部署 基于 ceph-deploy 部署…

---usb 摄像头的Linux 下查询的命令

0) 先 列一下机子上所插的摄像头: ~$ v4l2-ctl --list-devices iContact Camera Pro: iContact C (usb-0000:00:14.0-2): /dev/video3 /dev/video4 /dev/media1 USB 2.0 PC Camera: PC Camera (usb-0000:00:14.0-8): /dev/video1 /dev/video2 /dev…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

【已解决】“EndNote could not connect to the online sync service”问题的解决

本人不止一次在使用EndNote软件时遇到过“EndNote could not connect to the online sync service”这个问题。 过去遇到这个问题都是用这个方法来解决&#xff1a; 这个方法虽然能解决&#xff0c;但工程量太大&#xff0c;每次做完得歇半天身体才能缓过来。 后来再遇到该问…

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…

Ubuntu从入门到精通(二)远程和镜像源配置齐全

Ubuntu从入门到精通(二) 1 常见操作配置 1.1 英文语言配置 1.1.1 打开设置 1.1.2 设置语言为英文 1.1.3 重启生效 1.1.4 再次进入,选择更新名字 1.1.5 再次进入,发现已经变成了英文 1.2 输入法配置 1.3 rustdesk安装 1.3.1 Windows系统配置 登陆:https://github.com…

【Node.js】全面解析 Node.js 安全最佳实践:保护您的应用

Node.js 是一种强大的 JavaScript 运行时&#xff0c;广泛用于构建现代 Web 应用和 API。然而&#xff0c;由于其开放性和异步特性&#xff0c;Node.js 应用容易受到多种安全威胁的攻击&#xff0c;比如 SQL 注入、跨站脚本 (XSS) 和拒绝服务攻击 (DoS)。在本文中&#xff0c;我…

【代码随想录】哈希

242. 有效的字母异位词 原题链接 算法思想&#xff1a;哈希,排序 哈希思想&#xff1a;重点就是迅速查找&#xff0c;通过key和值的迅速匹配&#xff0c;所以当题目是与 “唯一性” 有关时可用 用哈希表维护字母出现的次数 方法一&#xff1a;哈希 我的做法&#xff1a;用…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

ChatGPT Search VS Kimi探索版:AI搜索哪家强?!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

寻的制导律:从理论到应用的全景展示(下)

寻的制导律&#xff1a;从理论到应用的全景展示&#xff08;下&#xff09; 第六章 制导系统设计与实现 在制导系统的设计与实现过程中&#xff0c;系统需求分析、硬件与软件架构设计以及实现与测试方法是关键的三个环节。通过系统化的方法论&#xff0c;可以确保制导系统在复…

【Swift】类型标注、类型安全和类型推断

文章目录 类型标注类型安全和类型推断什么是类型安全和类型推断为什么说Swift是一门安全语言类型安全带来的好处 类型标注 当你声明常量或者变量的时候可以加上类型标注&#xff08;type annotation&#xff09;&#xff0c;说明常量或者变量中要存储的值的类型。如果要添加类…

Linux常用命令,持续更新钟

在Linux系统中&#xff0c;你可以使用多种命令来拷贝和移动文件及目录。以下是常用的几个命令及其用法&#xff1a; 一、拷贝文件或目录 cp 命令 cp 命令用于拷贝文件或目录。 拷贝文件&#xff1a; cp source_file destination_file 例如&#xff1a; cp file1.txt /hom…