java中线程池的简介及使用方法

目录

介绍     

优点

运行原理

线程池的使用流程

基本使用步骤:

代码示例:


介绍     

         线程池是一种并发编程的技术,用于管理和复用多个线程以执行异步任务。它通常由两部分组成:任务队列和一组线程。任务队列用于存储待执行的任务,而线程池则负责管理一组预先创建的线程,这些线程可以从任务队列中获取任务并执行。

优点

线程池的主要优点包括:

  • 降低资源消耗:通过重用线程,避免了频繁创建和销毁线程所带来的开销,从而降低了系统的资源消耗。

  • 提高响应速度:由于线程池中的线程可以立即执行任务,而不需要等待新线程的创建,因此可以更快地响应任务的到达。

  • 控制并发度:通过限制线程池中线程的数量,可以有效控制系统的并发度,防止过多的并发任务导致系统资源的竞争和耗尽。

  • 提高系统稳定性:线程池可以根据系统的负载情况动态调整线程数量,从而使系统在高负载时能够保持稳定运行,而不会因为线程数量不足或过多而导致性能下降或崩溃。

线程池在各种并发编程场景中都得到了广泛应用,例如网络服务器、数据库连接池、线程池等。Java中的java.util.concurrent包提供了丰富的线程池实现,包括ThreadPoolExecutor等。

运行原理

线程池的使用流程

基本使用步骤:

  • 创建线程池:使用Executors类提供的静态工厂方法来创建不同类型的线程池。例如:
  • 提交任务:使用execute()方法提交需要执行的任务给线程池。任务可以是实现了Runnable接口的对象或者实现了Callable接口的对象。
  • 执行任务:线程池会自动管理线程的生命周期,并执行提交的任务。
  • 关闭线程池:在不需要线程池时,需要手动关闭以释放资源。通常使用shutdown()shutdownNow()方法来关闭线程池。
  • 处理任务执行结果:如果任务提交时使用了Callable接口,可以通过Future对象来获取任务的执行结果。

通过合理地配置线程池的大小和参数,可以避免因为线程创建销毁造成的性能开销,并且能够更好地控制并发量,提高系统的稳定性和性能。

代码示例:

   Executors.newCachedThreadPool() 用于创建一个根据需要自动调整线程数量的线程池的方法。它返回一个 ThreadPoolExecutor 实例,这个线程池会根据需要创建新线程,如果有空闲线程可用,就会重用之前创建的线程。如果一个线程在 60 秒内没有被使用,那么它将被终止并从缓存中移除。

    /*** 测试方法:演示创建一个缓存线程池,并提交多个任务,最后关闭线程池。* 缓存线程池会根据需要创建新线程,如果线程在可重用时间内变为空闲,则可能会被终止并从池中移除。*/@Testpublic void test2() throws ExecutionException, InterruptedException {// 创建线程池ExecutorService executorService = Executors.newCachedThreadPool();// 提交三个不同类型的线程任务Integer integer = executorService.submit(new CallableTest()).get();  //Callable可以获取返回结果executorService.submit(new RunnableTest());executorService.submit(new ThreadTest());// 关闭线程池,等待所有任务完成executorService.shutdown();}

   Executors.newFixedThreadPool(5) 是 Java 中用于创建一个固定大小的线程池的方法,其中参数 5 表示线程池中线程的数量为 5。这意味着该线程池最多同时运行 5 个线程,而不会动态地增加或减少线程数量。这种类型的线程池适用于需要限制并发线程数量的场景,比如控制资源的使用,避免因为创建过多线程而导致系统资源耗尽。

/*** 测试方法:演示创建一个固定大小的线程池,并提交多个任务,最后关闭线程池。* 固定大小的线程池维护固定数量的线程,在任务过多时会排队等待执行。*/@Testpublic void test3() throws ExecutionException, InterruptedException {// 创建一个固定大小为5的线程池ExecutorService executorService = Executors.newFixedThreadPool(5);// 提交三个任务,线程池会根据空闲线程数量来执行这些任务Integer integer = executorService.submit(new CallableTest()).get();  //Callable可以获取返回结果executorService.submit(new RunnableTest());executorService.submit(new ThreadTest());// 关闭线程池,等待所有任务完成executorService.shutdown();}

ThreadPoolExecutor 类用于创建自定义的线程池,它拥有七个参数:

  1. 核心线程数(Core Pool Size): 指定了线程池中保持的最小线程数,即使线程是空闲的。在没有任务执行时,核心线程也不会被回收。在这个例子中,核心线程数为 3。

  2. 最大线程数(Maximum Pool Size): 指定了线程池中可拥有的最大线程数。当有新的任务提交到线程池时,如果当前运行的线程数小于核心线程数,则会创建新线程执行任务。如果当前线程数达到核心线程数,并且任务队列已满,则会创建新线程直到达到最大线程数。在这个例子中,最大线程数为 6。

  3. 空闲线程存活时间(Keep Alive Time): 当线程空闲时间达到此值后,如果线程数超过核心线程数,就会根据存活时间的设置来终止并移除这些空闲线程。在这个例子中,空闲线程存活时间为 60 秒。

  4. 存活时间的单位(Time Unit): 指定了空闲线程存活时间的单位,通常是秒、分钟或小时。在这个例子中,时间单位为秒。

  5. 任务队列(Blocking Queue): 用于存储等待执行的任务的队列。在这个例子中,使用了一个容量为 3 的有界阻塞队列 ArrayBlockingQueue,它会按先进先出(FIFO)的顺序执行任务。此外还可以使用链式阻塞队列作为任务队列,即 LinkedBlockingQueue,它没有固定的容量(理论上是 Integer.MAX_VALUE),可以无限存储任务。

  6. 线程工厂(Thread Factory): 用于创建新线程的工厂。在这个例子中,使用了 Executors.defaultThreadFactory() 来创建默认的线程工厂。

  7. 拒绝策略(Rejected Execution Handler): 当线程池无法执行任务时的处理策略。在这个例子中,使用了 ThreadPoolExecutor.AbortPolicy(),表示当无法执行任务时,会抛出 RejectedExecutionException 异常来拒绝新任务的提交。

自定义的线程池适用于需要灵活控制核心线程数、最大线程数以及任务队列容量的场景。

    /*** 测试用例:创建并配置一个线程池执行任务。* 本测试用例中,线程池的核心线程数为3,最大线程数为6,空闲线程存活时间为60秒。* 线程池使用ArrayBlockingQueue作为任务队列,容量为3。* 使用默认的线程工厂创建线程,并且采用AbortPolicy拒绝策略。* 向线程池提交三个任务后,关闭线程池。*/@Testpublic void test4() throws ExecutionException, InterruptedException {// 创建ThreadPoolExecutor实例,配置各项参数ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(// 核心线程数:线程池一直保持的最小线程数3,// 最大线程数:线程池可拥有的最大线程数6,// 空闲线程存活时间:当线程空闲时间达到此值后,如果线程数超过核心线程数,将被终止并移除60,// 存活时间的单位TimeUnit.SECONDS,// 任务队列:用于存储等待执行的任务new ArrayBlockingQueue<>(3),// 线程工厂:用于创建新线程Executors.defaultThreadFactory(),// 拒绝策略:当线程池无法执行任务时的处理策略new ThreadPoolExecutor.AbortPolicy());// 向线程池提交三个任务Integer integer = threadPoolExecutor.submit(new CallableTest()).get();  //Callable可以获取返回结果threadPoolExecutor.submit(new RunnableTest());threadPoolExecutor.submit(new ThreadTest());// 关闭线程池,等待所有任务完成threadPoolExecutor.shutdown();}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

el-select下拉框远程搜索且多选时,编辑需要回显的一个简单案例

前端业务开发中不管使用vue2~3&#xff0c;还是react&#xff0c;angular各种前端技术栈&#xff0c;经常会遇到这种业务。一个下拉框Select中&#xff0c;不仅需要需要支持远程模糊搜索&#xff0c;还需要支持多选。并且在编辑时&#xff0c;还能正常把已经多选好的内容回显到…

视频改字祝福 豪车装X系统源码uniapp前端源码

uniapp视频改字祝福 豪车装X系统源码 全开源,只有uniapp前端,API接口需要寻找对应的。 创意无限!AI视频改字祝福,豪车装X系统源码开源,打造个性化祝福视频不再难! 想要为你的朋友或家人送上一份特别的祝福,让他们感受到你的真诚与关怀吗?现在, 通过开源的AI视频改字…

如何进行制造设备数据汇集,发挥数据的价值?

数字化转型正深刻推动制造企业实现远程监控、提高生产效率、降低生产成本、优化产品质量及明晰精细化方向。并且工业互联网的发展离不开工业数据的应用&#xff0c;而制造设备数据汇集正是应用的基础。但制造设备数据汇集存在以下难点及痛点&#xff1a; 1、安全把控难 关键的…

如何创建默认的docker0网桥

背景 重启docker服务之后&#xff0c;发现并没有创建默认的docker0网桥&#xff0c;所以导致端口无法映射&#xff0c;容器内IP为127.0.0.1。重启服务后&#xff0c;仍然没有docker0网桥的出现。 分析 docker0网桥是docker默认创建的虚拟网桥。但是有时候会发现&#xff0c;d…

56-FMC连接器电路设计

视频链接 FMC连接器电路设计01_哔哩哔哩_bilibili FMC连接器电路设计 1、FMC简介 1.1、FMC介绍 FMC&#xff08;FPGA Mezzanine Card&#xff09;是一个应用范围、适应环境范围和市场领域范围都很广的通用模块。FMC连接器连接了由FPGA提供的引脚和FMC子板的I/O接口。最新的…

机械校准件

机械校准件 校准 精度高 重复性好 涵盖多种同轴、波导校准件 校准件是矢量网络分析仪的测试附件&#xff0c;可大幅提高矢量网络分析仪的测试精度。 国产思仪机械校准件包含N型、3.5MM、2.92MM、2.4MNM、1.85MM全频段校准件以及特殊要求的校准件&#xff0c;可满足矢量…

python爬虫 - 爬取html中的script数据(zum.com新闻信息 )

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法&#xff0c;编写爬虫代码3. 使用re.search 方法&#xff0c;编写爬虫代码 1. 分析页面内容数据格式 &#xff08;1&#xff09;打开 https://zum.com/ &#xff08;2&#xff09;按F12&#xff08;或 在网页上右键 --…

【工具】录屏软件Captura安装使用及ffmpeg下载配置

开启技术视频创作&#xff0c;录屏软件林林总总&#xff0c;适合的、习惯的最好。 录屏软件Captura的使用及ffmpeg下载配置 1.Captura下载、安装2.FFmpeg下载、配置3.Captura屏幕录制试用、录制视频效果 1.Captura下载、安装 Captura主要是一个免费开源的录屏软件&#xff0c…

西电超算使用方法-简易版

一、引言 西电超算不错&#xff0c;我很喜欢。本文仅供自己学习使用。 二、环境搭建 搭建环境需要有一些依赖库&#xff0c;但是其实西电超算说明手册并没有写的非常清楚。因此&#xff0c;这次实战演示一下&#xff0c;写一个运行sh文件脚本并提交作业。 1、选择GPU还是CP…

kontron触摸屏维修控创工控机TN1015-OC-19DCA11-XXX

德国Kontron控创工控机维修维修包括&#xff1a;Kontron人机界面、Kontron显示终端、Kontron工业控制计算机、Kontron处理器板、Kontron低功耗处理器、Kontron强固处理器板、Kontron图形板卡、Kontron核处理器板、Kontron工控机电源、Kontron主机故障等 kontron工控机维修常见…

【C语言刷题系列】交换整数的奇数位和偶数位

目录 一、问题描述 二、解决思路 三、函数实现 四、宏实现 五、总结 个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 C语言刷题系列 一、问题描述 使用C语言代码实现&#xff1a;将一个整数的奇数位和偶数位交换 二、解决思路 在C语…

世媒讯提供海内外媒体宣发服务,引领企业新媒体发展之路

在这个信息化的时代&#xff0c;软文发稿已经成为企业发展不可或缺的重要工具。随着社会的快速发展&#xff0c;消费者需要更多定制化、个性化的信息。利用软性推广&#xff0c;凭借其细致入微的信息传递&#xff0c;可以迅速抓住消费者的注意力&#xff0c;从而进一步推动企业…

为什么要写技术方案?

技术方案是为研究解决各类技术问题&#xff0c;有针对性&#xff0c;系统性的提出的方法、应对措施及相关对策。技术方案设计是一个技术开发者必备的能力&#xff0c;特别是对于高级、资深、架构师等角色。技术方案设计不仅能够帮助我们明确需求&#xff0c;规划架构&#xff0…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 1 - 2节&#xff09; P1《课程介绍》 开场白&#xff0c;HarmonyOS 的一个简介&#xff0c;话不多说&#xff0c;直接看图吧&…

虚假新闻检测——Adapting Fake News Detection to the Era of Large Language Models

论文地址&#xff1a;https://arxiv.org/abs/2311.04917 1.概论 尽管大量的研究致力于虚假新闻检测&#xff0c;这些研究普遍存在两大局限性&#xff1a;其一&#xff0c;它们往往默认所有新闻文本均出自人类之手&#xff0c;忽略了机器深度改写乃至生成的真实新闻日益增长的现…

Java编程题 | 张三等待乘坐电梯的时间计算

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 张三在学校教学楼的电梯前排了很多人&#xff0c;他的前面有n个人在等电梯。电梯每次可以乘坐12人&#xff0c;每次上下需要的时间为4分钟&#xff08;上需要2分钟&am…

【第18章】spring-resource

文章目录 前言一、Resource1.测试类2.测试结果 二、ResourceLoader1.测试类2.测试结果 三、ResourceLoaderAware1.实现类2.配置文件3.测试类4.测试结果5.结论 总结 前言 在Spring框架中&#xff0c;Resource是一个关键组件&#xff0c;它位于org.springframework.core.io包中&…

【深度学习】DDoS-Detection-Challenge aitrans2024 入侵检测,基于机器学习(深度学习)判断网络入侵

当了次教练&#xff0c;做了个比赛的Stage1&#xff0c;https://github.com/AItransCompetition/DDoS-Detection-Challenge&#xff0c;得了100分。 一些记录&#xff1a; 1、提交的flowid不能重复&#xff0c;提交的是非入侵的数量和数据flowid,看check.cpp可知。 2、Stage…

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…