浅谈线程池及submit()和execute()的区别

并发编程——线程池 目录 一、为什么要使用线程池 二、自定义线程池 自定义任务队列 自定义线程池管理器 拒绝策略接口 测试(任务生产者) 总结流程 三、线程池 ThreadPoolExecutor 线程池状态 线程池的工作状态 四、Executors 类 newFixedThreadPool(固定大小的线程池) newCachedThreadPool(带缓冲工厂的线程池) newSingleThreadExecutor(单线程的线程池) ... 阅读详情

本文主要介绍两个方面的内容,其一:线程池的类型及其应用场景;其二:submit和execute的区别。

一、线程池概述

首先,线程池的使用,是非必须的。并不是涉及到启用多线程的地方,就非得整出个线程池出来!

1.1,什么是线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。

1.2,为什么用

备注:个人愚见,请读者自行评估可信度

线程池——池——容器;那么线程池里面装着啥呢,线程!

知道为什么盛水的容器,有杯子、有瓶子、有桶、有河......不?

所以,不要拿一个线程池去装一、两个线程。线程池,也是一种资源的消耗,它主要解决的是线程的生命周期和资源开销问题!比如说,我们常用的方式是,在需要一个线程的时候,去创建一个线程,然后用完了之后,再进行销毁。如果一个程序段需要启用10个线程,那么我们就将执行10次这样的操作和切换。这个过程中,资源的消耗和时间的消耗是需要考虑的。那么,使用线程池是什么呢?

1,在需要用到多线程的时候,先创建一个线程池,另其睡眠,再要使用的时候,直接唤醒拿过来用,然后用完了,进行统一销毁!

2,作为容器,那么必定有容量的概念。线程池能控制最大的工作线程数量,保证资源的有效利用!


1.3,线程池的结构

1、线程池管理器(ThreadPoolManager):用于创建并管理线程池
2、工作线程(WorkThread): 线程池中线程
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。


1.4,怎么用

首先看看线程池的类图:


虽然executor是线程池的顶层接口,但真正实现的接口却是:executorService,所以,当我们使用线程池的时候,用如下代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;">ExecutorService threadPool = Executors.newSingleThreadExecutor();</span>


备注:newSingleThreadExecutor()是线程池的其中一种类型!可以根据需要,实例化其他类型!

二、线程池的类型及其应用场景

2.1,newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

2.2,newCachedThreadPool

创建一个可缓存的线程池。这种类型的线程池特点是: 
1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。 
2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。

2.3,newSingleThreadExecutor

创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。

2.4,newScheduleThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。

2.5,几种类型的对比

FixedThreadPool
是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。
CachedThreadPool
特点是在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源。但是,但当出现新任务时,又要创建一新的工作线程,又要一定的系统开销。并且,在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

 


三、submit()和execute()的区别

三个区别:

1、接收的参数不一样

2、submit有返回值,而execute没有

Method submit extends base method Executor.execute by creating and returning a Future that can be used to cancel execution and/or wait for completion. 

用到返回值的例子,比如说我有很多个做validation的task,我希望所有的task执行完,然后每个task告诉我它的执行结果,是成功还是失败,如果是失败,原因是什么。然后我就可以把所有失败的原因综合起来发给调用者。

个人觉得cancel execution这个用处不大,很少有需要去取消执行的。

而最大的用处应该是第二点。

3、submit方便Exception处理

There is a difference when looking at exception handling. If your tasks throws an exception and if it was submitted with execute this exception will go to the uncaught exception handler (when you don't have provided one explicitly, the default one will just print the stack trace to System.err). If you submitted the task with submit any thrown exception, checked or not, is then part of the task's return status. For a task that was submitted with submit and that terminates with an exception, the Future.get will rethrow this exception, wrapped in an ExecutionException.

意思就是如果你在你的task里会抛出checked或者unchecked exception,而你又希望外面的调用者能够感知这些exception并做出及时的处理,那么就需要用到submit,通过捕获Future.get抛出的异常。


原文请访问:http://www.cnblogs.com/hhx626/p/6010281.html

ThreadPoolExecutor的中的submit和FutureTask || 通过Executors 创建线程池的一些实例(Callable和Runnable的在其中的体现) 线程的创建方式,Callable接口和Future接口的配合,Runnable任务、Callable任务提交到线程池,他们之间的区别 阅读详情

相关推荐

Java线程池中submit() 和 execute()方法有什么区别

点个关注,必回关。

ManuMAX的博客 1147

Java并发基础(18):ExecutorService中submit方法详解

1 submit() submit( ):该方法接收Runnable或Callable对象作为输入参数(该方法输入参数请参考上篇文章java线程池任务提交(Runnable、Callable、FutureTask), 这篇文章主要讲submit方法的返回值以及返回值的使用),返回一个Future对象。submit方法提交的任务中的call方法如果返回Integer,那么submit方法就返回Future<Integer>;如果call方法返回Float,那么submit方法就返回Future&

mingyuli的博客 3440

pcle接口详解&用途说明

它原来的名称为“3GIO”,由英特尔在2001年提出。pcel x16插槽 用途用于显卡、RAID阵列卡,向下兼容PCIE x1/x4/x8/x16。(PCIE x16插槽长89mm,有164根针脚,靠主板外侧端有一卡口,将16x分为前后两组,短插槽有22根针脚,主要用于供电,长插槽142根,主要用于数据传输,具有16通道所带来的高带宽)PCI-E x8插槽插槽用途:全长56mm,有98根针脚,与PCI-E x16比较,主要是数据针脚减少至76根,短的供电针脚仍然是22针脚。

qq_43289307的博客 1万+

JAVA线程池submit详解 ,execute和submit提交任务的区别

JAVA线程池submit详解 ,execute和submit提交任务的区别

胖虎儿的博客 1万+

手把手教你用示波器测试DDR5 DRAM信号完整性(附眼图分析技巧)

本文详细介绍了如何使用示波器测试DDR5 DRAM信号完整性,包括眼图分析技巧。从DDR5的核心挑战、测试设备选型到实测工作流程,提供了全面的指导。特别强调了DFE功能验证和系统级协同测试,帮助工程师解决信号完整性问题,提升测试效率。

g2h3i4j5的博客 1155

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1248

【多线程 5】线程池的类型以及submit()和execute()的区别

就跟题目说的一样,本篇博客,本宝宝主要介绍两个方面的内容,其一:线程池的类型及其应用场景;其二:submit和execute的区别。那么需要再次重申的是,对于概念性的东西,我一般都是从网上挑选截取,再结合自己的想法进行说明。 一、线程池概述 首先,线程池的使用,是非必须的。并不是涉及到启用多线程的地方,就非得整出个线程池出来! 1.1,什么是线程池 线程池是一种多线程处理形式,处理过程中将...

该怎么解释?我懒得解释 5480

哨兵2植被参数反演避坑指南:SNAP中10m/20m分辨率选择与缺失波段处理

本文深入解析了使用SNAP软件进行哨兵2号植被参数反演时的关键操作与决策。核心在于理解SNAP生物物理处理器NNET10m与NNET20m的架构差异,根据是否需要反演冠层叶绿素含量(Cab)等参数,明智选择10米或20米分辨率工作流。文章详细指导了大气校正、波段重采样及处理L2A数据中B01波段“缺失”等常见问题的解决方案,为生态监测与精准农业应用提供清晰的避坑指南和完整实战流程。

wdx01234567的博客 262

线程池提交执行任务中execute()方法和submit()的区别

文章目录简介方法来源不同接收的参数不同返回值不同异常的处理 简介 在线程池的使用中,我们一般用ThreadPoolExecutor来创建线程池,创建好线程池后会将任务提交给线程池来执行。在提交任务的时候,JDK为我们提供了两种不同的提交方式,分别是submit()和excute(),那么它们两者之间有什么不同呢?相互之间有什么关系呢?下面简单的介绍下 方法来源不同 execut()是在线程池的顶级接口Executor中定义的,而且只有这一个接口,可见这个方法的重要性。 public interface Ex

qing040513的博客 1万+

川崎机器人 AS语言基础运动指令表

    功能简介 动作方式 参考坐标系 位置特性 X,Y,Z 角度特性 O,A,T 指令格式(距离单位毫米,时间单位秒,角度单位度 示例1 示例2 运 动 指 令 JMOVE 以关节移动到目标点 关节移动方式 基础坐标系 不受控 伪随机动作 JMOVE 目标点 JMOVE #yd JMOVE put1 LMOVE 以直线移动到目标点 直线移动方式

喜欢自学并分享经验的技术宅 9352

大数据利器Hadoop:从基础到实战,一篇文章掌握大数据处理精髓!

在当今大数据时代,数据量的爆炸式增长对企业和技术提出了前所未有的挑战。如何高效地存储、处理和分析这些庞大的数据集,成为了亟待解决的问题。Hadoop作为一种分布式计算框架,应运而生,为大数据处理提供了有效的解决方案。Hadoop是一个由Apache软件基金会维护的开源项目,它基于Google的分布式文件系统(Google File System,GFS)和MapReduce计算模型设计。Hadoop的主要目标是处理大规模数据集,它可以在普通硬件集群上运行,从而降低了大数据处理的成本。

邓邓子的博客 8280

线程池中submit()和 execute()区别与联系

摘要:Java线程池中,submit()和execute()方法用于提交任务,主要区别在于:1) execute()仅支持Runnable任务且无返回值,异常由线程池处理;2) submit()支持Runnable和Callable任务,返回Future对象可获取结果,异常通过Future.get()捕获。推荐优先使用submit()以获取更强大的任务管理能力,同时注意合理关闭线程池避免资源泄漏。

weixin_50055999的博客 1289

ROS从入门到精通1-1:ROS核心架构、常用指令与计算图

本文介绍ROS的核心架构,各个文件、目录的用途、常用命令行工具、动态计算图原理。

FRIGIDWINTER的博客 6369

线程池的submit和execute区别

线程池中的execute方法大家都不陌生,即开启线程执行池中的任务。还有一个方法submit也可以做到,它的功能是提交指定的任务去执行并且返回Future对象,即执行的结果。下面简要介绍一下两者的三个区别: 1、接收的参数不一样 2、submit有返回值,而execute没有 用到返回值的例子,比如说我有很多个做validation的task,我希望所有的task执行完,然后每个task告诉我它的执行结果,是成功还是失败,如果是失败,原因是什么。 然后我就可以把所有失败的原因综合起来发给调用者。 个人觉得c

京北游戏官方 1万+

视频理解与处理——OpenClaw视频能力深度解析(2026视频版)

本文介绍了OpenClaw视频理解与处理的核心技术,重点分析了视频预处理流程。通过VideoProcessor类实现视频加载、帧采样、尺寸调整和归一化等基础处理功能,支持本地和在线视频源处理,为后续视频分析任务提供标准化输入。预处理模块采用均匀采样和标准化方法优化视频数据,确保动作识别、场景分析等高级应用的准确性,展现了OpenClaw强大的视频处理能力。

一键难忘的博客 464

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java线程池submit和execute有什么区别?

**:** 在线程池中,`submit` 和 `execute` 都用于提交任务,但有明显区别。`execute` 仅支持 Runnable 接口,不返回结果,适用于无需关注执行结果的任务;而 `submit` 支持 Callable 和 Runnable,返回 Future 对象,可跟踪任务状态和获取结果。因此,选择方法需根据具体需求来决定。

yanpeng2580的博客 903

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

submit()和execute()的区别

如果任务抛出异常,异常会由线程池的未捕获异常处理器处理。源码体现。

hnsqls的博客 1181

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 线程池中 execute() 和 submit() 的区别(源码 & 实战全解析)

Java线程池execute()与submit()方法核心区别 execute()和submit()是Java线程池最常用的两个方法,主要差异在于: 功能定位 execute():仅执行任务,不关心结果 submit():管理任务,可获取Future返回值 核心差异 execute()直接抛出异常,submit()将异常封装到Future submit()支持任务取消、结果获取和批量管理 使用场景 execute()适用于日志记录等无需返回值的场景 submit()适用于需要结果汇总、异常处理的业务逻辑 本

Knight 1626

线程池中execute和submit的区别?

通过执行submit方法 该方法返回值为Future对象,为抽象类AbstractExecutorService的方法,被ThreadPoolExecutor继承,其内部实现也是调用了接口类Executor的execute方法,通过上面的类图可以看到,该方法的实现依然是ThreadPoolExecutor的execute方法。Worker实现了Runable接口,在调用start()方法候,实际执行的是run方法Worker实现了Runable接口,在调用start()方法候,实际执行的是run方法。

kfashfasf的博客 843

线程池ThreadPoolExecutor中submit方法和execute方法的区别和关系

ThreadPoolExecutor是线程池,其继承AbstractExecutorService,如下代码: package java.util.concurrent; import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.HashSet; import ...

任枫的博客 4055

Java多线程 - 线程池中submit()和execute()方法有什么区别?

问题:线程池中submit() 和execute() 方法有什么区别? 向线程池提交任务的两种方式: 方式一:调用execute()方法,例如: // Executor接口中的方法 public interface Executor { void execute(Runnable command); } 方式二:调用submit()方法,例如: // ExecutorService接口中的方法 public interface ExecutorService extends Executor

你今天真好看呀 3718

线程池 execute与submit的区别

在使用线程池的时候,看到execute()与submit()方法。都可以使用线程池执行一个任务,但是两者有什么区别呢? execute void execute(Runnable command); submit <T> Future<T> submit(Callable<T> task); <T> Future<T> sub...

qq_38008721的博客 2072

线程池方式开启线程--submit()和execute()的区别

没有引用线程池的时候,需要我们通过继承Thread类和实现Runnable、Callable接口,最终调用start()方法启动线程。现在我们可以通过线程池的execute()和submit()方法来提交线程任务。

m0_57640408的博客 2353

线程池的execute()和submit()区别

线程池的execute()和submit()区别* -----------本篇文章是博主第一篇文章,若有错的地方请指出 最近我正在学线程池,一定有很多人像我一样有疑惑,线程池的execute()和submit()都是向线程池提交一个任务,他们有什么区别?? 下面我们先看一下submit()的源码: public Fut...

weixin_43234372的博客 764
上一篇: 深入浅出 Java 垃圾回收机制
下一篇: HashMap和Hashtable的区别
南哥220
博客等级 码龄9年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值