Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 中 Executor 和 Executors 的区别是什么?

Java 中 Executor 和 Executors 的区别是什么?

作者头像
用户1289394
发布于 2023-08-22 08:53:19
发布于 2023-08-22 08:53:19
4430
举报
文章被收录于专栏:Java学习网Java学习网

Java 中 Executor 和 Executors 都是与多线程开发相关的类,它们在管理线程池中的线程方面都有一定的作用。虽然很相似,但其主要区别如下:

Executor

1、Executor 是一个基础接口。它服从线程池和任务队列的分离原则,提供了一个简单、标准的方法来执行 Runnable 对象的任务,可以让实现者自己选择队列类型,并通过指定线程的调度策略、创建一个全新的线程或重复使用已有的线程来调整线程数目,以满足应用程序获得最优吞吐量。

2、Executor 的核心思想结合可扩展性设计,您可以面向抽象接口编写代码,从而充分利用多个线程之间的竞争和协作。对于分批处理的操作,你不用等待某个操作完成后再启动另一个操作;只需盯着那个‘工作时间表’即可。

3、Executor 缺点是需要手动创建线程池,如果没有正确配置线程池大小和任务队列的长度,则会导致线程阻塞或太多的 CPU 资源消耗。这意味着如果不能正确地使用 Executor 类,那么将极大的影响应用程序的运行效率。 而且线程数量和生命周期控制等不是很方便。

Executors

1、Executors 是一个工厂方法类,提供了一些静态工厂方法用于创建线程池、提供常用的任务队列实现,并包括很好的限流策略,可以大大减少编码工作量。它为异步计算提供了更友好、方便的访问方式。

2、Executors 支持定时执行以及延迟执行、递归查询(CompletionService)、并发任务完成和快捷创建固定大小的线程池等多种方式来简化线程池的创建问题和ScheduleExecutorService沟通问题;另外 Executors 还支持从任务队列中获取已经处理完的结果;

3、Executors 的弊端是可能会清除 ThreadPoolExecutor 中的意外事故。开发者在使用过程中需要谨慎,目前Java 11对老版本的 Executor.xxx()进行了废弃处理,并提出要尽力使用ThreadPoolExecutor构造方法,或newCachedThreadPool, newFixedThreadPool, newWorkStealingPool 等专用方法。

总的来说,Executor 和 Executors 是两种不同的多线程机制,即接口之一与实现的区别:以Executor 类为基础,Executors 功能更加丰富。它们都可用于管理线程池中的多个线程,但如果想要更具灵活性的高级线程控制和错误处理选项,则需要使用一个实现了 Executor 接口的 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor。

虽然 Executors 是一个工厂方法类,提供了一些静态工厂方法用于创建线程池,但是需要谨慎。因为Executors 还存在一些缺点,在极端情况下,会导致一些意外事故和性能问题。对于线程池的细节和管理控制需求比较高的开发人员,建议直接使用 ThreadPoolExecutor。

Executor 是一个实现多线程设计的接口,其重要作用是通过队列排程来执行任务并防止资源耗尽;Executor 的缺点是手动调整线程池的大小和任务队列的长度比较麻烦;Executors为开发者提供了方便的创建线程池、常见队列实现和限流策略等,从而支持定时执行和其他常用任务类型,并且支持从任务队列中获取处理后的结果等;另外虽然 Executors 提供了许多简便功能,与 ThreadPoolExecutor 相比,Executors 仍然具有一些不同,包括可能出现的异常抛出、过度消耗 CPU 资源、线程数量和生命周期控制等问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
并发编程之Executor,Executors,ExecutorService和ThreadPoolExecutor
学习java并发编程,一定要对线程池非常了解,这样才能更好的管理线程,使用线程,从而提升效率。但是,对于初学者往往对Executor,Executors,ExecutorService,ThreadPoolExecutor傻傻分不清,小文特别梳理总结了,用于工作学习。 区分Executor,Executors及其ExecutorService: Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可
企鹅号小编
2018/01/22
2.1K0
并发编程之Executor,Executors,ExecutorService和ThreadPoolExecutor
Java中的线程池与Executor框架详解
Java中的线程池是通过Executor框架来实现的,Executor框架提供了一系列的接口和类来简化线程池的使用和管理。下面将详细介绍Java中线程池的相关概念和Executor框架的主要组成部分。
用户1289394
2024/04/03
1490
Java中的线程池与Executor框架详解
Java并发编程的艺术(七)——Executors
Executors框架简介 Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逸出。 Executor框架包括:线程池,Executor,Executors,ExecutorService,Co
大闲人柴毛毛
2018/03/09
8540
12.ThreadPoolExecutor线程池原理及其execute方法
jdk1.7.0_79   对于线程池大部分人可能会用,也知道为什么用。无非就是任务需要异步执行,再者就是线程需要统一管理起来。对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空闲的线程就执行,没有空闲的线程就等待。实际上对于线程池的执行原理远远不止这么简单。   在Java并发包中提供了线程池类——ThreadPoolExecutor,实际上更多的我们可能用到的是Executors工厂类为我们提供的线程池:newFixedThreadPo
用户1148394
2018/01/12
1.3K0
12.ThreadPoolExecutor线程池原理及其execute方法
【小家java】用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)
在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动。但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的问题而产生的,他使得线程可以被复用,就是线程执行结束后不被销毁,而是可以继续执行其他任务。(这里可以用tomcat做例子进行思考)
YourBatman
2019/09/03
3.7K0
【小家java】用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)
在Java中Executor和Executors的区别?
在Java中,Executor和Executors都与线程池和并发执行有关,但它们是不同的概念和类。
曾高飞
2025/06/05
900
Java--线程池
两者相差的时间为100倍以上,这边使用的线程池回头再来看,由这个例子可以看出,线程的创建到运行过程,会花费大量的cpu时间,争对需要大量并发的操作,使用线程池可以大大提高程序性能
aruba
2021/12/06
3500
Java--线程池
【小家java】Java中的线程池,你真的用对了吗?(教你用正确的姿势使用线程池,Executors使用中的坑)
在【小家java】用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理。
YourBatman
2019/09/03
1.9K0
【小家java】Java中的线程池,你真的用对了吗?(教你用正确的姿势使用线程池,Executors使用中的坑)
java创建线程池代码_java手写线程池
当队列和线程池都满了,说明线程池处于饱和的状态,那么必须采取一种策略处理提交的新任务。这个策略默认是AbortPolicy,表示无法处理新任务时抛出异常
全栈程序员站长
2022/11/14
8490
【Java 基础篇】Executors工厂类详解
在多线程编程中,线程池是一项重要的工具,它可以有效地管理和控制线程的生命周期,提高程序的性能和可维护性。Java提供了java.util.concurrent包来支持线程池的创建和管理,而Executors工厂类是其中的一部分,它提供了一些方便的方法来创建不同类型的线程池。本文将详细介绍Executors工厂类的使用方法和各种线程池的创建方式,以及一些注意事项和最佳实践。
繁依Fanyi
2023/10/12
3290
【Java 基础篇】Executors工厂类详解
一篇搞懂线程池
在上一篇文章《spring boot使用@Async异步任务》中我们了解了使用@Async的异步任务使用,在这篇文章中我们将学习使用线程池来创建异步任务的线程。
小森啦啦啦
2019/07/14
6900
juc系列-Executor框架
ThreadPoolExecutor是jdk提供的线程池的服务类,基于ThreadPoolExecutor可以很容易将一个实现Runnable接口的任务放入线程池中执行,下面是ThreadPoolExecutor实现:
topgunviper
2022/05/12
4050
juc系列-Executor框架
java线程池(一):java线程池基本使用及Executors
在前面学习线程组的时候就提到过线程池。实际上线程组在我们的日常工作中已经不太会用到,但是线程池恰恰相反,是我们日常工作中必不可少的工具之一。现在开始对线程池的使用,以及底层ThreadPoolExecutor的源码进行分析。
冬天里的懒猫
2020/09/17
1.4K0
java线程池(一):java线程池基本使用及Executors
Java线程池分享
分析一下: T1,T3是多线程本身的带来的开销,希望减少T1,T3所用的时间,从而减少T的时间。如果在程序中频繁的创建或销毁线程,这导致T1和T3在T中占有相当比例。显然这是突出了线程的弱点(T1,T3),而不是优点(并发性)。线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的
每天学Java
2020/06/01
7540
Java线程池分享
Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可能导致系统OOM。在UIL中引入了线程池这种技术来管理线程。合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗
xiangzhihong
2018/01/30
8180
Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
ThreadPoolExecutor 类
实现了 ExecutorService 接口,是 java 开发常用的线程池类。位于 java.util.concurrent 包内,使用时需要进行导入。
Qwe7
2022/08/07
3080
深入理解 Java 线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
静默虚空
2019/12/26
5080
深入理解 Java 线程池
相关推荐
并发编程之Executor,Executors,ExecutorService和ThreadPoolExecutor
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档