Java线程池的使用

Java 线程池的作用以及该如何使用 服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发、耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作。常规的方法是针对一个新的请求创建一个新线程,虽然这种方法似乎易于实现,但它有重大缺点。为每个请求创建新线程将花费更多的时间,在创建和销毁线程时花费更多的系统资源。因此同时创建太多线程的 JVM 可能会导致系统内存不足,这就需要限制要创建的线程数,也就是需要使用到线程池。 一、什么是 Java 中的线程池? 线程池技术就是线程的重用技术,使用之前创建好 阅读详情

在开发过程中,我们有时需要频繁创建多个线程进行运算的时候,每次都new出一个新的Thread对象并不能有效地利用资源,同时可能造成由于线程缺乏统一管理,无限制创建新线程,占用过多资源导致线程死锁问题。在这样的情况下我们就可以使用Java的线程池来管理、调度线程。

线程池的的优点在于三点:

一,能够复用存在的线程,减少创建、销毁线程的操作,减少进行对应操作的开销;

二、能够有效控制并发数量,提高系统资源利用率,避免过多资源竞争,避免拥堵;

三、提供定式执行、定期执行、单线程、并发数控制等。

Java提供的线程池有4种:newFixedThreadPool、newScheduledThradPool、newCachedThreadPool、newSingleThreadExecutor。

创建线程池,可以通过Executors的对应方法来实现:

newFixedThreadPool:创建一个指定长度的线程池,线程最大并发数量不超过线程池长度,如果超出则等待其他线程执行完毕。

public class ExecutorDemo {
	
	public static void main(String[] args) {
		ExecutorService executorService=Executors.newFixedThreadPool(4);
		for(int i=0;i<8;i++){
			executorService.submit(new ExecRunnalbe());
		}
		executorService.shutdown();
	}
	
}

Executors.newFixedThreadPool(4)创建了一个长度为4的线程池,并且返回一个ExecutorService对象,用于对线程池的调度,通过submit方法向线程池的线程注入Runnable或者Callable。执行之后的结果:

pool-1-thread-2正在运行
pool-1-thread-1正在运行
pool-1-thread-3正在运行
pool-1-thread-2正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-2正在运行
pool-1-thread-4正在运行

可以看出,就算当前线程需要执行的线程有8个,实际并发执行的线程只有4个,线程空闲之后会被复用。

newScheduledThread:创建一个指定长度的线程池,允许周期性执行,支持定时执行。

public class ExecutorDemo {
	public static void main(String[] args) {
		ScheduledExecutorService schedService=Executors.newScheduledThreadPool(3);
		schedService.scheduleAtFixedRate(new ExecRunnalbe(),1,3,TimeUnit.SECONDS);
	}
	
}

Executors.newScheduledThreadPool(3)方法创建了一个长度为3的线程池,并且返回一个ScheduledExecutorService对象,可以通过该对象注入任务Runnable。scheduleAtFixedRate方法声明如下:

•	scheduleAtFixedRate
•	ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
•	                                       long initialDelay,
•	                                       long period,
                                       TimeUnit unit)

可以看出,第一个参数为需要执行的Runnable,第二个参数是延迟时间,第三个参数为任务周期,第四个参数为时间单位。

运行之后程序会一直执行Runnable的任务,输出结果如下:

pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-2正在运行
pool-1-thread-2正在运行
pool-1-thread-3正在运行
pool-1-thread-1正在运行
pool-1-thread-2正在运行
pool-1-thread-3正在运行
....

上述代码中创建的线程池长度为3,所以线程池中始终最多只有三个线程运行,并且在执行shutdown方法之前(上面的代码没有),程序会周期性地执行线程。

newCacheThreadPool:创建一个可缓冲线程池,如果存在空闲的线程,复用空闲线程,否则创建新线程。

public class ExecutorDemo {

	
	public static void main(String[] args) {
		ExecutorService cacheService=Executors.newCachedThreadPool();
		for(int i=0;i<8;i++){
			if(i==6){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			cacheService.submit(new ExecRunnalbe());
		}
		cacheService.shutdown();
		
	}
	
}

上述程序中,当i不等于6之前,由于不断需要新线程,所以程线程池会不断创建线程来满足需求,当i等于6时,由于主线程休眠1秒,子线程执行完毕之后空闲,休眠结束之后线程池中有空闲的线程则复用线程,故输出结果:

pool-1-thread-2正在运行
pool-1-thread-6正在运行
pool-1-thread-4正在运行
pool-1-thread-3正在运行
pool-1-thread-1正在运行
pool-1-thread-5正在运行
pool-1-thread-5正在运行
pool-1-thread-6正在运行

可以明显看出线程pool-1-thread-5和pool-1-thread-6被复用。

newSingleThreadExecutor:创建一个单线程的线程池,其保证任务按指定顺序执行。

public class ExecutorDemo {
	
	public static void main(String[] args) {
		ExecutorService executorService=Executors.newSingleThreadExecutor();
		for(int i=0;i<8;i++){
			executorService.submit(new ExecRunnalbe());
		}
		executorService.shutdown();  //关闭线程池
	}
	
}
输出结果:
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
pool-1-thread-1正在运行
可以看出线程池中始终只有唯一一个线程执行。

ExecRunnable类:

class ExecRunnalbe implements Runnable{
	
	@Override
	public void run(){
		System.out.println(Thread.currentThread().getName()+"正在运行");
	}
	
}

SAP UI5 主题设置全解析:从启动参数到运行时切换、跨域白名单与事件监听 SAP UI5主题体系深度解析:从配置到切换的完整指南 摘要:SAP UI5主题机制远不止CSS换肤,其工程化实践涵盖启动配置、运行时API切换、跨库路径映射及安全管控等关键环节。通过bootstrap标签或URL参数设置初始主题,运行时可用Theming.setTheme无刷新切换。自定义主题需配置theme-roots路径,跨域加载需声明sap-allowed-theme-origins白名单。主题切换完成后会触发applied事件,适合执行视觉同步操作。该体系支持多品牌适配、集中式主题管理,在Fior 阅读详情

相关推荐

DSPF28335:从零到一,实战GPIO与外部中断的嵌入式系统交互设计

本文以德州仪器DSPF28335芯片为例,详细讲解了嵌入式系统中GPIO与外部中断(EXTI)的实战配置方法。通过一个完整的按键控制LED并触发ADC采样的项目,深入剖析了GPIO寄存器配置、三级中断机制(外设-PIE-CPU)以及中断服务函数编写的核心要点,帮助开发者掌握嵌入式交互设计的基石,并提供了关键的避坑指南与调试清单。

weixin_29169899的博客 115

java线程池案例

简介 线程Thread是一个重量级资源,线程的创建、启动以及销毁都是比较耗费系统资源的,同时受限于系统资源的限制,线程的数量与系统性能是一种抛物线的关系,因此对线程的管理,是一种非常好的程序设计习惯,自JDK1.5起,utils包提供了ExecutorService[ɪɡˈzɛkjətɚ]线程池的实现。通俗的将:为了避免重复的创建线程,线程池的出现可以让线程进行复用。当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用。 一个线程池包括以下四个基

人生就像一场戏 1万+

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

qq_31444421的博客 2万+

Java线程池应用实例

线程池是多线程的一种处理方式,处理过程中将任务添加到队列中,线程创建完成后自动启动这些任务,任务就是实现了Runnable或Callable接口的实例对象。可以根据系统需求和硬件环境灵活控制线程的数量,对线程进行统一管理。3、12306网上购票。

Rsun2018的博客 6157

set_output_delay的本质

set_output_delay的本质

qq_33300585的博客 3392

SPSS新手教程—两步聚类之结果解读

在《详解SPSS两步聚类之参数设置》一文中,我们已经了解了两步聚类的优点、分析原理,以及参数设置的技巧。 在本节中,会对IBM SPSS Statistics聚类后的结果进行解读,其中会涉及到最终聚类的结果、聚类的质量、变量重要性、聚类特征的解读。 如图1所示,我们先来回顾下本例数据在参数设置面板中的详细设置。 图1:二阶聚类设置 一、数值结果 根据上述参数设置,得到如下的数值分析结果。 首先看到自动聚类结果,如图2所示为聚类的透视表结果,展示了不同聚类数目下的BIC、BIC变化量、BIC变

nekonekoboom的博客 3万+

Java多线程案例——线程池

Java多线程案例——线程池

如风暖阳的博客 1万+

磁悬浮轴承控制策略设计及性能对比

摘要:针对高速磁悬浮转子控制问题,本文提出多方案对比分析。建立含陀螺效应的5自由度动力学模型,分析陀螺耦合、质量不平衡等关键挑战。对比四种控制策略:基础PID解耦、交叉反馈+自适应陷波、H∞鲁棒+前馈补偿、滑模控制+观测器,从实时性、鲁棒性等维度评估优劣。推荐采用交叉反馈+H∞+自适应陷波的混合方案,通过内环电流环与外环位置环协同,实现陀螺效应动态解耦和扰动抑制。实施步骤包括系统辨识、控制器设计、硬件部署等,需配合实验验证与参数整定。该方案综合性能最优,适用于高转速、强扰动场景。

技术工作者 1775

Java线程池使用样例

最近接触的项目,数据量都大的离谱,一些复杂的算法功能运行起来简直是灾难。话不多说,下面提供一种用线程池加快程序运行的样例参考,欢迎大家讨论指正。

如果是雨天,你会想起我 2219

数学建模国赛B题保姆级攻略:从选题到代码实现的完整流程(2024最新版)

本文提供2024年数学建模国赛B题的保姆级实战攻略,涵盖从赛题解构、模型构建到算法实现与论文撰写的完整流程。文章详细解析了如何快速抓住问题核心、建立数学模型、进行算法求解与结果可视化,并分享了高效团队协作与专业论文写作的关键技巧,助力参赛者系统性地完成从选题到代码实现的全过程。

weixin_29089057的博客 143

2026年大数据开发工程师常见面试选择题

大数据面试高频考点解析 摘要:本文汇总了30道大数据开发面试高频题目,涵盖Hadoop生态、Spark、Flink、Kafka等核心组件。重点包括:1)HDFS架构与特性(5V特征、副本机制);2)MapReduce/Spark原理(Shuffle过程、RDD抽象);3)实时计算(Kafka消费组、Flink Watermark);4)数据仓库设计(分层模型、性能优化)。特别强调数据倾斜、小文件问题等实战场景的解决方案,以及从日志、资源等多维度排查任务异常的方法。掌握这些基础原理和典型问题应对策略,是应对大

不务正业的猿 453

JAVA基础:线程池的使用

线程池是一种常见的多线程编程技术,它允许我们在系统中使用一个固定数量的线程来执行任务,以免过多的线程拉低了系统的性能。在本文中,我们将探讨线程池的使用和一些最佳实践,以便在您的代码中获得更好的性能和可维护性。

拾一二的博客 5187

Python爬虫实战:基于Playwright与异步技术的专利数据抓取系统

专利数据是企业技术创新、市场竞争分析和行业趋势预测的关键情报来源。然而,专利数据通常分散在各个国家的专利局网站,数据结构复杂,反爬机制严格,使得高效抓取成为技术挑战。本文将详细介绍如何构建一个基于最新Python技术的专利数据抓取系统,涵盖Selenium的现代化替代方案Playwright、异步编程、智能代理轮换等高级技术。

2201_76125261的博客 1563

java线程池介绍以及使用

本文借鉴Java线程池介绍及使用(这一篇就够了)_java 线程池使用-优快云博客Java线程池实现原理及其在美团业务中的实践(推荐观看)

m0_62458145的博客 1360

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java 线程池的原理以及使用

java 线程池的原理以及使用

zhouguizhi 797

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java线程池使用详解ThreadPoolExecutor使用示例

一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 1) 任务(Runnable /Callable) 2) 任务的执行(Executor) 3) 异步计算的结果(Future) 2.3 Executor 框架的使用示意图 三 (重要)ThreadPoolExecutor 类简单介绍 3.1 ThreadPoolExecutor 类分析 3.2 推荐使用 ThreadPoolExecutor 构造函数创建线程池 四 ..

xu_yong_lin的博客 5万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java线程池的使用

本文转载于以下文章,原文链接如下: https://www.cnblogs.com/ljp-sun/p/6580147.html https://blog.youkuaiyun.com/yinni11/article/details/79917640 前言 为什么需要线程池? 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3

weixin_41979002的博客 1869

Java线程池详细介绍与使用

文章目录前言一、线程池基础1、什么是线程池2、为什么使用线程池3、线程池有那些优势二、线程池使用1、Java内置线程池:ThreadPoolExecutor2、通过Executor工厂类中的静态方法获取线程池对象第一种、通过newCachedThreadPool获取线程池对象第二种、通过newFixedThreadPool获取线程池对象第三种、通过newSingleThreadExecutor获取线程池对象关闭线程方法:shutdown和shutdownNow的区别三种创建线程池的区别3、Java内置线程池

weixin_47316183的博客 1万+

Java线程池如何使用?

1️⃣。

weixin_74795979的博客 1264

java线程池使用最全详解

在执行一个异步任务或并发任务时,往往是通过直接降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;提高系统响应速度,当有任务到达时,无需等待新线程的创建便能立即执行;方便线程并发数的管控,线程若是无限制的创建,不仅会额外消耗大量系统资源,更是占用过多资源而阻塞系统或oom等状况,从而降低系统的稳定性。线程池能有效管控线程,统一分配、调优,提供资源使用率;更强大的功能,线程池提供了定时、定期以及可控线程数等功能的线程池,使用方便简单。@Override。

GitHub质检员 2234

Java多线程——线程池使用

本文介绍一下Java多线程中线程池的使用方式。

qq_50867577的博客 1271

java线程池的使用与详解

java线程池的使用与详解 【转载】本文转载自两篇博文:              1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html                   这篇文章通过源码详细介绍了java线程池的主要接口和类方法,十分清晰,值得拜读              2.Java线程池使用说明:h

懒人部落 2028

JAVA线程池的使用

线程池是另一种池化思想的运用,把线程放入池中进行管理。这种方法的好处是可以避免线程的创建、切换和销毁,因为这些过程非常耗资源。一般情况下,大厂都不建议工程师自己创建线程池,因为线程池创建很容易消耗大量内存。JAVA线程池的基本原理,其实就是对线程的生产者-消费者模型。JAVA线程池会确定核心线程数和最大线程数,来控制线程池的大小。如上图所示,右半部分是线程池的管理,而左半部分是任务的执行。JAVA线程池主要做的事情是对线程池的管理和任务的执行。其中,Task为相关线程。JAVA线程池就是这样的一种线程池。

wangzhezhilu001的专栏 1029

java并发线程池的使用_Java并发编程:线程池的使用

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的...

weixin_32463071的博客 435

详解线程池的作用及Java中如何使用线程池

服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发、耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作。常规的方法是针对一个新的请求创建一个新线程,虽然这种方法似乎易于实现,但它有重大缺点。为每个请求创建新线程将花费更多的时间,在创建和销毁线程时花费更多的系统资源。因此同时创建太多线程的 JVM 可能会导致系统内存不足,这就需要限制要创建的线程数,也就是需要使用到线程池。 一、什么是 Java 中的线程池? 线程池技术就是线程的重用技术,使用之前创建.

字母哥博客 1640

java线程池拒绝策略_Java线程池详解与使用场景

· 线程池的概念· 线程池原理和线程池几个常用参数· 线程池的工作流程· 几种常用线程池的使用场景· 线程池任务拒绝策略线程池的概念在阿里巴巴Java手册有这么一条【强制】线程资源必须通过线程池来提供,不允许在应用中自行显示创建线程。使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题,如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者"过度切...

weixin_39915308的博客 194
上一篇: Java线程的基本使用(二)
下一篇: DataTablesUtil服务器端分页查询
ZGUIZ
博客等级 码龄10年 106粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值