线程池创建和用法

常见线程池的具体用法 常见线程池的具体用法。 阅读详情

线程池创建方式

一、Executors
1、newFixedThreadPool
1.1 创建固定大小的线程池。
1.2 创建方式:ExecutorService fixedTp= Executors.newFixedThreadPool(int count);
1.3 适用场景:执行长期的任务
2、newCachedThreadPool
2.1 创建一个不限线程数上限的线程池,任何提交的任务都将立即执行
2.2 创建方式:ExecutorService cachedTp = Executors.newCachedThreadPool();
2.3 适用场景:执行很多短期异步的小程序或者负载较轻的服务器	
3、newSingleThreadExecutor
3.1 创建只有一个线程的线程池,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行		
3.2 创建方式:ExecutorService SingleTp = Executors.newSingleThreadExecutor();	
3.3 适用场景:一个任务一个任务执行的场景
4、newScheduledThreadPool
4.1 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。
4.2 创建方式:ScheduledExecutorService schedTp= Executors.newScheduledThreadPool(5);
4.3 适用场景:周期性执行任务的场景
创建一个定长的线程池,线程池可以周期性或延迟执行如下:
 (1)  scheduledTp.schedule(r1, 5, TimeUnit.SECONDS);//延迟3秒后执行r1
 (2)  scheduledTp.scheduleAtFixedRate(r2,5,3,TimeUnit.SECONDS);//延迟5秒后每3秒执行一次r2
二、ThreadPoolExecutor

Executors创建线程池的快捷方法,实际上是调用了ThreadPoolExecutor的构造方法

 public ThreadPoolExecutor(
 int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。
 int maximumPoolSize, // 线程数的上限
 long keepAliveTime, TimeUnit unit, // 超过corePoolSize的线程的idle时长,
                                    // 超过这个时间,多余的线程会被回收。
 BlockingQueue<Runnable> workQueue, // 任务的排队队列
 ThreadFactory threadFactory, // 新线程的产生方式
 RejectedExecutionHandler handler) // 拒绝策略

 举例:
 ExecutorService executorService = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, 
 new ArrayBlockingQueue<>(512), // 使用有界队列,避免OOM
 new ThreadPoolExecutor.DiscardPolicy());//DiscardPolicy 对溢出队列的任务不做处理,直接忽略
其他拒绝策略
AbortPolicy	 抛出RejectedExecutionException(默认)
DiscardOldestPolicy  丢弃执行队列中最老的任务,尝试为当前提交的任务腾出位置
CallerRunsPolicy	直接由提交任务者执行这个任务
三、两种线程池创建方式的异同
1、Executors.newXXXThreadPool()快捷方法创建线程池,这种方式使用无界的任务队列,容易造成OOM
	建议使用ThreadPoolExecutor的构造方法手动指定各项参数。
	2、提交任务的类型分为Runnable和Callable 二者区别如下:
	 2.1 方法签名不同,void Runnable.run(), V Callable.call() throws Exception
	 2.2 是否允许有返回值,Callable允许有返回值
	 2.3 是否允许抛出异常,Callable允许抛出异常。
	提交任务的方式:
	Future<T> submit(Callable<T> task)	有返回值
	void execute(Runnable command)	无返回值
	Future<?> submit(Runnable task)	虽然返回Future,但是其get()方法总是返回null
四、一个简单实例
private static ExecutorService executor = new ThreadPoolExecutor(0, 16,
            60000L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10240),
            new ThreadFactoryBuilder().setNameFormat("feed-push-thread-%d").build(),
            new ThreadPoolExecutor.AbortPolicy());
            
            
executor.submit(()->{

	//执行对应的逻辑
});
解决Java线程池创建异常问题 在Java开发中,线程池是一种常用的并发编程工具,用于管理和调度线程的执行。然而,有时候我们可能会遇到无法创建线程池的异常情况。本文将介绍如何解决Java线程池无法创建的异常,并提供相应的源代码示例。线程池由一组预先创建的线程组成,这些线程可用于执行任务。通过重用线程,线程池可以提高应用程序的性能和资源利用率。要解决这个问题,我们可以增加线程池的容量或者重新创建一个新的线程池。如果你对线程池的更深入了解或者其他相关问题有进一步的探索,欢迎继续提问。方法创建一个缓存线程池,它会根据需要自动调整线程池的大小。 阅读详情

相关推荐

GNSS差分码偏差(DCB)从原理到实战:如何避免数据处理中的常见错误

本文深入解析GNSS差分码偏差(DCB)的原理及其对高精度定位的关键影响。针对数据处理中因忽略DCB校正导致的常见错误,如单系统PPP高程偏差、多系统融合精度下降及电离层研究失真等,提供了实战解决方案与主流DCB产品获取、集成方法,帮助用户有效规避陷阱,提升数据处理精度。

k5l6m的博客 224

Java之JUC

了解JUC

m0_46803792的博客 692

从零开始:如何用PSINS工具箱构建你的第一个IMU误差模型

本文详细介绍了如何使用严恭敏教授开发的PSINS工具箱构建IMU误差模型,涵盖从基础参数设置到高级误差建模的全过程。通过imuerrset函数配置陀螺零偏、随机游走等核心参数,并结合实战案例展示消费级MEMS器件的误差建模方法,帮助用户提升惯性导航系统的精度与可靠性。

weixin_29284885的博客 322

线程池的方式与使用场景

线程池的方式与使用场景 1、newFixedThreadPool:创建固定大小的线程池。线程池的大小一旦达到最大值就会保持不变,如果某个线程异常结束,线程池会补充一个新线程。 2、newCashedThreadPool:创建可缓存的线程池。如果线程池的大小超过了处理任务所需的线程,那么就回收部分空闲的线程(60秒不执行任务的线程)。当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池...

qq_41877948的博客 350

从寄存器配置到G值:一份给STM32开发者的SC7A20加速度数据换算保姆级指南

本文为STM32开发者提供SC7A20三轴加速度传感器的数据换算保姆级指南,详细解析从寄存器配置到G值转换的全过程。涵盖量程选择、输出值换算原理及优化代码实现,帮助开发者快速掌握加速度数据的物理意义转换技巧,提升运动感知系统开发效率。

weixin_29172963的博客 172

保姆级教程:用MediaPipe和BlazePose在Python里实时追踪你的健身动作(附完整代码)

本文提供了一份详细的Python教程,教你如何使用MediaPipe和BlazePose实现实时健身动作追踪。从环境配置、模型选型到实时视频流处理架构设计,再到健身动作量化分析和可视化反馈系统优化,教程涵盖了完整的实现步骤和代码示例,帮助开发者快速构建高效的姿态特征点检测系统。

weixin_42531779的博客 153

线程池的创建和使用

概述 线程池就比如是一个装线程的池子,里面存在很大创建时就创建好的线程 创建的线程池要手动关闭,否则线程池里面的线程一直处于空闲,等待任务 线程池在启动的时,会创建大量空闲线程,当我们向线程池提交任务的时,线程池就会启动一个线程来执行该任务。等待任务执行完毕以后,线程并不会死亡,而是再次返回到线程池中称为空闲状态。等待下一次任务的执行。 创建线程池的方式 一、用Executors类的静态方法 static ExecutorService newCachedThreadPool() :创建一个默认的线程

qq_45147076的博客 1039

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

视觉人机器视觉的博客 2037

常用的线程池模式以及不同线程池的使用场景

使用有界队列时队列大小需和线程池大小互相配合,线程池较小有界队列较大时可减少内存消耗,降低。该策略时线程池饱和后将由调用线程池的主线程自己来执行任务,因此在执行任务的这段时间里主线程。这里引申出一个小技巧:有时我们可能希望线程池在没有任务的情况下销毁所有的线程,既设置线程池。设置的话这样的用法会发生奇怪的行为:直到等待队列被填满才会有新线程被创建,任务才开始执行。无法再提交新任务,从而使线程池中工作线程有时间将正在处理的任务处理完成。如果无法将请求加入队列,则创建新的线程,除非创建此线程超出。

2301_78102191的博客 839

图像拼接——ITKMontage

ITKMontage是一个开源的、高性能的图像拼接软件模块。它的核心任务是将多张部分重叠的图像瓦片(Tiles)拼接成一幅完整的大图,专为处理材料显微科学中产生的大规模、高分辨率图像而设计。针对ITKMontage模块中示例进行了修改,解决了没有文件TileConfiguration.txt的情况,以及使用中的一些BUG。ITKMontage可以单独编译,也可以作为ITK的一个模块进行编译,介绍后一种的cmake设置。本文介绍使用ITKMontage模块进行图像拼接的方法。此处省略编译后的库配置。

2301_79131410的博客 100

【项目实战】自动化测试软件VectorCAST介绍

VectorCAST是一款先进的自动化测试软件。VectorCAST是一款功能强大、易于使用的自动化测试软件。VectorCAST适用于各种嵌入式系统的测试。VectorCAST为嵌入式系统的测试提供了一种高效、可靠的解决方案。VectorCAST提供了一整套完整的测试工具,包括测试管理、代码覆盖、缺陷定位、报告生成等,以帮助开发人员提高测试效率,确保软件质量。VectorCAST支持。

奶爸的编程之路,也就一周冷个三天 2012

【Thread】线程池的 7 种创建方式及自定义线程池

1. 什么是线程池 线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个“池子”内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从“池子”内取出相应的线程执行对应的任务即可。 使用线程池主要有以下优点: 降低资源消耗 提高响应速度 提高线程的可管理性 同时,阿里巴巴在其《Java开发手册》中也强制规定:线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 2. 使用线程池 线程池的创建方法总共有 7 种,但总体来说可分为 2 类:

sco5282的博客 3万+

一种基于机载LiDAR点云电力线自动提取方法

文章目录一、引言二、算法实现2.1实现步骤2.2实现代码 一、引言 二、算法实现 2.1实现步骤 (1)首先采用首先采用高程滤波方法去除地面点和低矮地物点,滤波后的点云数据中除电力线点云外还含部分杆塔点、高植被点和噪声点。 (2)根据点云空间维度特征提取电力线点,使用空间密度聚类的方法实现单根电力线精确分离。 2.2实现代码 在这里插入代码片 ...

dayuhaitang1的博客 5172

JDK1.8源码分析:Executors线程池创建工厂的用法和实现原理

概述 在Executor线程执行器框架中,提供了Executors这个工具类来创建指定的Executor实现类。在Executors工具类中提供了ThreadPoolExecutor创建时所需的默认参数,通过方法名称来表明指定的实现,从而简化了ThreadPoolExecutor的创建。 固定线程池,无界队列 线程池的核心线程数和最大线程数固定且相同,任务等待队列无界: public st...

源码之下,了无秘密 6457

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

boost创建线程池_Java并发 之 线程池系列 (1) 让多线程不再坑爹的线程池

目录背景线程池的来由什么是线程池背景总结用法通过Executors创建线程池Executors及其服务的类Executors常用的几个方法一个线程池的例子任务池子测试说明总结Links文章友链相关资源背景线程池的来由服务端的程序,例如数据库服务器和Web服务器,每次收到客户端的请求,都会创建一个线程来处理这些请求。创建线程的方式又很多,例如继承Thread类、实现Runnable或者Callabl...

weixin_30371285的博客 167

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

详细说说 JDK 的线程池的创建参数

下面看一个具体的例子,我们自己定义一个线程池,核心线程数是 1,最大线程数是 1,任务队列长度是 2,然后我们往里面塞 5 个任务,从定义可知这个线程池最多只能处理 3 个任务,所以最后两个任务会执行拒绝策略。就是非核心线程的保活时间,也就说当添加任务的时候如果队列已经塞满了,这时候会创建非核心线程去执行任务,这些非核心线程的保活时间就是。合理设置线程数量,根据系统的 CPU 核心数和任务类型(CPU 密集型或 I/O 密集型),合理设置线程池的核心线程数和最大线程数。

Jwasx的博客 1240

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java线程池用法

通过重用已经创建的线程来执行新的任务,线程池提高了程序的响应速度,并且提供了更好的系统资源管理。// 根据需要创建新线程的线程池,对于短生命周期的异步任务非常合适。// 用于延迟执行或定期执行任务的线程池。在实际开发中,根据任务的特性和需求选择合适的线程池类型是非常重要的。// 尝试立即停止所有正在执行的任务,并返回等待执行的任务列表。

silver687的博客 315

剖析线程池:深入理解Java中的线程池构造和调优技巧

在这个例子中,我们创建了一个核心线程数为4,最大线程数为10,并且非核心线程的存活时间为60秒的线程池。工作队列是容量为100的 LinkedBlockingQueue。当队列满时,执行策略是 AbortPolicy,即抛出 RejectedExecutionException 异常。ScheduledThreadPoolExecutor 是 ThreadPoolExecutor 的一个扩展,用于在给定的延迟之后执行命令,或者定期地执行命令。此类是设计为执行线程池中任务的定时或周期性调度。

逆流的小鱼 1314

java基础之线程池,线程组

本文主要是java线程中的线程池和线程组相关知识

weixin_50691399的博客 806

线程池和设计模式

Wait和Sleep的区别: 1.它们最大本质的区别是,Sleep()不释放同步锁,Wait()释放同步锁。 2.还有用法的上的不同是:Sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不 3.到你只能调用Interreput()来强行打断;Wait()可以用Notify()直接唤起。 4.这两个方法来自不同的类分别是Thread和Object 5.最主要是Sleep方法没有释放锁,而Wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 进程的状态 初始(New):新

qq_45142938的博客 663

Java之创建线程池的四种方式

Java之创建线程池的四种方式。

Tian208的博客 330

python线程池模块_Python线程池模块ThreadPoolExecutor用法分析

本文实例讲述了Python线程池模块ThreadPoolExecutor用法。分享给大家供大家参考,具体如下:python3内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致。首先导入模块from concurrent.fu...

weixin_39615499的博客 513

如何在C#中创建和使⽤线程池?请提供⽰例代码

线程池是一种管理线程的机制,通过重用线程来减少创建和销毁线程的开销,从而提升应用程序性能。长时间运行的任务可能会占用线程池线程,导致其他任务延迟执行。这种方式结合了线程池和任务模型,适用于现代 C# 编程场景。多线程可能引发资源竞争,需要注意线程同步和数据安全。类,可以实现更高效的并发任务管理。线程池适用于需要短时间运行的任务。将一个任务排入线程池队列中等待执行。对于更复杂的任务管理,推荐使用基于。方法,可以将任务排入线程池中。方法调整线程池线程数量。类来实现线程池功能。配合 Parallel。

fapw15的博客 385

Java 线程池介绍

线程池是Java并发编程中的一种重要工具,其主要功能是有效地管理和复用线程资源,以避免频繁创建和销毁线程所带来的性能开销。线程池的创建方式有自动和手动两种。虽然 JDK 提供了Executors工具类来简化线程池的创建,但我们在实际开发中,最好手动创建线程池业务需求的差异:自动创建的线程池(如等)是根据通用场景设计的,无法完全契合我们具体的业务需求。手动创建线程池可以根据业务场景灵活设置线程池的参数。自定义线程工厂:通过自定义线程工厂,我们可以为线程设置有意义的名称,方便后续的调试和日志分析。

qq_43539664的博客 954

线程池ThreadPool使用示例

package com.expgiga.JUC; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; import static java.util.concurrent.Executors.newFixedThreadPool; /** * 一、线程池:提供了一个线程队列,队列

1624

python线程池和进程池_python-线程池-进程池

线程池进程池 concurrent.futures什么是池要在程序开始的时候,还没提交任务先创建几个线程或者进程放在一个池子里,这就是池为什么要用池如果先开好进程/线程,那么有任务之后就可以直接使用这个池中的数据了并且开好的线程或者进程会一直存在在池中,可以被多个任务反复利用。这样极大的减少了开启\关闭\调度线程/进程的时间开销池中的线程/进程个数控制了操作系统需要调度的任务个数,控制池中的单位,...

weixin_39598308的博客 105
上一篇: Redis 有序集合ZSet数据结构操作
下一篇: YAPI的安装和配置
我是陈胖丁
博客等级 码龄11年 207粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值