java并发编程--Executor框架

Java并发编程实战:深入探索线程池与Executor框架 线程池是一种基于池化思想管理线程的资源管理技术。它预先创建并维护一定数量的线程,当有任务到来时,直接从线程池中获取空闲线程执行任务,而不是每次都创建新线程。降低资源消耗:减少了线程的创建和销毁开销。提高响应速度:由于线程池中的线程已经预先创建,可以快速响应任务请求。提高系统吞吐量:通过复用线程,系统能够同时处理更多任务。Java的线程池与Executor框架为高效并发编程提供了强有力的支持。通过合理配置线程池参数、正确提交和处理任务,可以显著提升系统的性能和稳定性。 阅读详情

原文地址:https://www.cnblogs.com/MOBIN/p/5436482.html

摘要:

       Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。

 

1.Exexctor简介

Executor的UML图:(常用的几个接口和子类)

Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),

 

ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法

 

AbstractExecutorService:ExecutorService执行方法的默认实现

 

ScheduledExecutorService:一个可定时调度任务的接口

 

ScheduledThreadPoolExecutor:ScheduledExecutorService的实现,一个可定时调度任务的线程池

 

ThreadPoolExecutor:线程池,可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象:

 

2.ThreadPoolExecutor构造函数的各个参数说明

ThreadPoolExecutor方法签名:

复制代码

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) //后两个参数为可选参数

复制代码

参数说明:

corePoolSize:核心线程数,如果运行的线程少于corePoolSize,则创建新线程来执行新任务,即使线程池中的其他线程是空闲的

 

maximumPoolSize:最大线程数,可允许创建的线程数,corePoolSize和maximumPoolSize设置的边界自动调整池大小:

corePoolSize <运行的线程数< maximumPoolSize:仅当队列满时才创建新线程

corePoolSize=运行的线程数= maximumPoolSize:创建固定大小的线程池

 

keepAliveTime:如果线程数多于corePoolSize,则这些多余的线程的空闲时间超过keepAliveTime时将被终止

 

unit:keepAliveTime参数的时间单位

 

workQueue:保存任务的阻塞队列,与线程池的大小有关:

  当运行的线程数少于corePoolSize时,在有新任务时直接创建新线程来执行任务而无需再进队列

  当运行的线程数等于或多于corePoolSize,在有新任务添加时则选加入队列,不直接创建线程

  当队列满时,在有新任务时就创建新线程

 

threadFactory:使用ThreadFactory创建新线程,默认使用defaultThreadFactory创建线程

 

handle:定义处理被拒绝任务的策略,默认使用ThreadPoolExecutor.AbortPolicy,任务被拒绝时将抛出RejectExecutorException

 

3.Executors:提供了一系列静态工厂方法用于创建各种线程池

   newFixedThreadPool:创建可重用且固定线程数的线程池,如果线程池中的所有线程都处于活动状态,此时再提交任务就在队列中等待,直到有可用线程;如果线程池中的某个线程由于异常而结束时,线程池就会再补充一条新线程。

方法签名:

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  //使用一个基于FIFO排序的阻塞队列,在所有corePoolSize线程都忙时新任务将在队列中等待
                                  new LinkedBlockingQueue<Runnable>());
}

   newSingleThreadExecutor:创建一个单线程的Executor,如果该线程因为异常而结束就新建一条线程来继续执行后续的任务

方法签名:

复制代码

public static ExecutorService newSingleThreadExecutor() {
   return new FinalizableDelegatedExecutorService
                     //corePoolSize和maximumPoolSize都等于,表示固定线程池大小为1
                        (new ThreadPoolExecutor(1, 1,
                                                0L, TimeUnit.MILLISECONDS,
                                                new LinkedBlockingQueue<Runnable>()));
}

复制代码

   newScheduledThreadPool:创建一个可延迟执行或定期执行的线程池

方法签名:

例1:(使用newScheduledThreadPool来模拟心跳机制)

复制代码

 1 public class HeartBeat {
 2     public static void main(String[] args) {
 3         ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
 4         Runnable task = new Runnable() {
 5             public void run() {
 6                 System.out.println("HeartBeat.........................");
 7             }
 8         };
 9         executor.scheduleAtFixedRate(task,5,3, TimeUnit.SECONDS);   //5秒后第一次执行,之后每隔3秒执行一次
10     }
11 }

复制代码

输出:

HeartBeat....................... //5秒后第一次输出
HeartBeat....................... //每隔3秒输出一个

   newCachedThreadPool:创建可缓存的线程池,如果线程池中的线程在60秒未被使用就将被移除,在执行新的任务时,当线程池中有之前创建的可用线程就重      用可用线程,否则就新建一条线程

方法签名:

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  //使用同步队列,将任务直接提交给线程
                                  new SynchronousQueue<Runnable>());
}

 

例2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class ThreadPoolTest {

    public static void main(String[] args) throws InterruptedException {

     ExecutorService threadPool = Executors.newCachedThreadPool();//线程池里面的线程数会动态变化,并可在线程线被移除前重用

        for (int i = 1; i <= 3; i ++) {

            final  int task = i;   //10个任务

            //TimeUnit.SECONDS.sleep(1);

            threadPool.execute(new Runnable() {    //接受一个Runnable实例

                public void run() {

                        System.out.println("线程名字: " + Thread.currentThread().getName() +  "  任务名为: "+task);

                }

            });

        }

    }

}

输出:(为每个任务新建一条线程,共创建了3条线程)

线程名字: pool-1-thread-1 任务名为: 1
线程名字: pool-1-thread-2 任务名为: 2
线程名字: pool-1-thread-3 任务名为: 3

去掉第6行的注释其输出如下:(始终重复利用一条线程,因为newCachedThreadPool能重用可用线程)

线程名字: pool-1-thread-1 任务名为: 1
线程名字: pool-1-thread-1 任务名为: 2
线程名字: pool-1-thread-1 任务名为: 3

通过使用Executor可以很轻易的实现各种调优  管理  监视  记录日志和错误报告等待。

 

4.Executor的生命周期

ExecutorService提供了管理Eecutor生命周期的方法,ExecutorService的生命周期包括了:运行  关闭和终止三种状态。

 

ExecutorService在初始化创建时处于运行状态。

shutdown方法等待提交的任务执行完成并不再接受新任务,在完成全部提交的任务后关闭

shutdownNow方法将强制终止所有运行中的任务并不再允许提交新任务

 

可以将一个Runnable(如例2)或Callable(如例3)提交给ExecutorService的submit方法执行,最终返回一上Futire用来获得任务的执行结果或取消任务

例3:(任务执行完成后并返回执行结果)

1

2

3

4

5

6

7

8

9

10

11

public class CallableAndFuture {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ExecutorService executor = Executors.newSingleThreadExecutor();

        Future<String> future = executor.submit(new Callable<String>() {   //接受一上callable实例

            public String call() throws Exception {

                return "MOBIN";

            }

        });

        System.out.println("任务的执行结果:"+future.get());

    }

}

输出:

任务的执行结果:MOBIN

 

ExecutorCompletionService:实现了CompletionService,将执行完成的任务放到阻塞队列中,通过take或poll方法来获得执行结果

例4:(启动10条线程,谁先执行完成就返回谁)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class CompletionServiceTest {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService executor = Executors.newFixedThreadPool(10);        //创建含10.条线程的线程池

        CompletionService completionService = new ExecutorCompletionService(executor);

        for (int i =1; i <=10; i ++) {

            final  int result = i;

            completionService.submit(new Callable() {

                public Object call() throws Exception {

                    Thread.sleep(new Random().nextInt(5000));   //让当前线程随机休眠一段时间

                    return result;

                }

            });

        }

        System.out.println(completionService.take().get());   //获取执行结果

    }

}

输出结果可能每次都不同(在1到10之间)

3

 

通过Executor来设计应用程序可以简化开发过程,提高开发效率,并有助于实现并发,在开发中如果需要创建线程可优先考虑使用Executor

 

告别‘线束丛林’:手把手拆解车身域控制器(BCM/PEPS/网关)的硬件选型与PCB布局要点 本文深入解析车身域控制器的硬件选型与PCB布局要点,涵盖主控MCU选择、通信接口设计、电源架构优化及EMC设计等关键环节。通过实战案例分享,帮助工程师解决高密度集成带来的电源完整性、热管理和信号隔离挑战,实现更稳定高效的汽车电子系统设计。 阅读详情

相关推荐

fastjson1.2.83反序列化漏洞

【代码】fastjson1.2.83反序列化漏洞。

Coder的博客 1万+

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

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1257

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

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

胖虎儿的博客 1万+

【QGIS】【OsGeo4w】安装方法

every blog every motto: You will never know unless you try 0. 前言 因为目前要使用QGIS,然而环境配置就整了大半天,哎,进行简单记录,方便自己方便他人。 一共分为两种方式安装: 独立安装包 网络安装包(下载osgeo4w-setup) QGIS提供了不同的版本: 长期发行版(LTR) 最新版(LR) 开发人员版本(DEV,母版或测试版) 说明: 本文推荐第二种 1. 正文 1.1 下载osgeo4w 下载链接 下载完成: 1.2

胡侃有料的博客 2万+

鸿蒙【ArkTS】使用TS装饰器封装网络请求HTTP

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的@ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。这里采用TS的装饰器实现AOP效果 完成前后端接口风格的统一

weixin_60376559的博客 5608

Java线程池submit阻塞获取结果实现原理

Java线程池中提交任务运行,通常使用execute()方法就足够了。那如果想要实现在主线程中阻塞获取线程池任务运行的结果,该怎么办呢?答案是用submit()方法提交任务。这也是面试中经常被问到的一个知识点,execute()和submit()提交任务的的区别是什么?底层是如何实现的?submit()方法中调用方法获取对象。// 调用FutureTask的构造方法返回RunnableFuture对象}复制代码FutureTaskFutureTask是一个异步计算任务,包装了我们外部提交的任务。

BASK2311的博客 2589

使用ShaderGraph制作URP各向异性

URP上用shaderGraph实现各向异性效果,解决只能用shader的问题

dreamform的专栏 1096

Java 并发编程 11 - 异步执行框架 Executor

下面是这些类和接口的简介。Executor是一个接口,它是 Executor 框架的基础,它将任务的提交与任务的执行分离开来。是线程池的核心实现类,用来执行被提交的任务。是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令。ScheduledThreadPoolExecutor 比 Timer 更灵活,功能更强大。Future接口和实现 Future 接口的FutureTask类,代表异步计算的结果。Runnable接口和Callable。

justlpf的专栏 965

vue3 - 详细实现视频/图片/图文“响应式瀑布流“列表布局示例代码,手机移动端H5或PC端电脑网页根据屏幕宽度自适应响应式瀑布流效果,支持数据列表动态懒加载,仿小红书图文视频div容器的瀑布流方案

vue3,nuxt3,瀑布流,响应式,图片瀑布流,视频瀑布流,图文瀑布流,手机移动端,H5瀑布流,电脑PC网站,手机电脑都能用的瀑布流布局,屏幕自适应,最好用的瀑布流组件插件,滚动分页加载瀑布流列表,瀑布流效果,自适应瀑布流布局详细教程,动态加载数据,懒加载,小红书,图文列表,视频列表,列表容器高度不一致怎么排列,整个屏幕全是宽高不固定的div容器列表怎么办,移动端和pc端双端实现瀑布流,vue3实现图片瀑布流布局以及响应式,滚动条触底懒加载,组件插件,vue3瀑布流 电脑手机都能用,解决卡顿不流畅,对不齐

✅ 精选推荐文章 4340

【产品经理修炼之道】- 基金产品-“TA系统 ”

TA:Transfer Agent 缩写,通常称成“登记过户”。开放式基金登记过户(TA)系统是基金的登记过户系统。其功能涵盖了基金交易业务的各个环节,包括账户业务处理,如投资者开户、修改账户资料、挂失/解挂等;日常交易业务处理,如认购、申购(一般申购和定期定额)、赎回(一般赎回、指定赎回、预约赎回等)、转托管、基金转换等;特殊业务处理,如非交易过户、账户冻结/解冻等;分红业务处理,如现金分红和红利再投资。

xiaoli8748的专栏 1673

Java并发编程框架之Executor 框架

Java 并发编程框架是用于简化并发程序开发的一系列工具和库,它们提供了高层次的抽象来管理线程、同步机制和其他与并发相关的资源。随着Java语言的发展,这些框架不断进化,为开发者提供更加高效且易于使用的API。

物联网工程专业 - 软硬兼修 980

YOLOv11的代数不变量解释:Syzygy模分析特征重要性,用交换代数揭示卷积核的语义相关性

本文提出了一种基于代数几何与交换代数的创新方法,特别是运用Syzygy模理论,对YOLOv11目标检测算法的卷积核语义相关性进行数学解释。研究揭示了YOLO系列算法演进背后的代数结构特征,建立了网络组件与多项式环、理想簇等代数概念的对应关系。通过构建分层的准同构代数系统,分析了YOLOv11在不同尺度下保持语义不变性的数学本质。文章系统阐述了Syzygy模在CNN特征冗余分析、跨层依赖关系建模和语义聚类中的应用,并提出了适用于动态稀疏训练的改进算法。该理论框架为深度神经网络的解释性研究提供了新的数学工具,同

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1269

Java并发编程——Executor框架

今天看到《Java并发编程实战》第六章的时候,书中讲了利用Executor框架来实现多线程,平时Executor用得不多,今天顺带学习了一下,写出来总结总结。 引入Executor框架的原因 两种多线程执行任务的策略: 1.串行执行,即每次线程运行完才会运行下一个线程。这种方法是线程安全的,但是效率低,吞吐量小 2.为每个任务开辟一个线程,例如为每个请求服务器的连接建立一个线程,这种方法开...

qq_39479426的博客 365

OV9734 DATASHEET,完整规格书

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

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

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

Java并发编程新纪元:探索Executor线程池框架

在Java并发编程领域,线程的创建与管理至关重要。传统通过new Thread()的方式在性能优化、资源高效利用及系统扩展性方面存在明显局限。鉴于此,本文将介绍Executor线程池框架,这一相较于传统线程创建方式更为优越的并发编程工具。Executor线程池框架通过复用线程、智能管理资源及灵活配置,显著提升了系统性能、优化了资源利用率,并增强了系统的可扩展性。

Rye的博客 2647

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java并发编程 Executor框架

Java并发编程 Executor框架 1. 在线程中执行任务 在理想情况下,各个任务之间是相互独立的:任务并不依赖于其他任务的状态、结果或者边界效应,独立性有助于实现并发,因为如果存在足够多的处理资源,那么这些独立的任务都可以并行执行。为了在调度与负载均衡等过程中实现更高的灵活性,每项任务还应该表示应用程序的一小部分处理能力。 2. 串行的执行任务 在应用程序中可以通过多种策略来调度任务,而其中一些策略能够更好地利用潜在的并发性。最简单的策略就是在单个线程中串行地执行各项任务。如下: public cla

liam12138的博客 222

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 并发编程 Executor 框架

Excutor 框架 1. 两级调度模型 在 HotSpot VM 的线程模型中,Java 线程被一对一映射为本地操作系统线程。在上层,Java 多线程程序通常应用分解成若干个任务,然后使用用户级的调度器(Executor)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器。这种两级调度模型的示意图如图所示: 从图中可以看出,应用程序通过 Executor 框架控制上层调度,下层的调度则由操作系统内核控制 2. 框架结构 Ex..

低吟不作语的博客 344

Java并发编程(九)《Executor框架》

Java并发编程九Executor框架 1 Executor框架简介 11 Executor框架的两级调度模型 111 两级调度模型图 112 解释 12 Executor框架的成员 121 任务接口Runnable或者Callable 122 任务的执行线程池 123 异步计算的结果返回Future和FutureTask 13 Executor框架的类与接口UML 14 Executor框架的的使

lvmama_tujp的博客 905

java executor_Java并发编程 - Executor框架

Executor框架分离了任务的创建和执行。JAVA SE5的java.util.concurrent包中的执行器(Executor)管理Thread对象,从而简化了并发编程。Executor引入了一些功能类来管理和使用线程Thread,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等.1.E...

weixin_39535557的博客 86

Java并发编程学习10-任务执行与Executor框架

本篇重点讲解任务执行和Executor框架的基础知识

Huazie 1348

【转】java并发编程-Executor框架

转载自 http://www.iteye.com/topic/366591   Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:   并发编程的一种编程方式是把任务拆分为...

topMan'blog 158

主题:java并发编程-Executor框架

http://www.iteye.com/topic/366591

CWH615的博客 440

java并发编程-Executor框架

Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为: 并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executo

Jmark 796

《Java并发编程的艺术》读后笔记-Executor框架简介(第十章)

文章目录《Java并发编程的艺术》Executor框架简介(第十章)1.Executor框架的两级调度模型2.Executor框架的结构与成员2.1 Executor框架的结构2.2 Executor框架的成员一、ThreadPoolExecutor二、ScheduledThreadPoolExecutor三、Future接口四、Runnable接口和Callable接口 《Java并发编程的艺术》Executor框架简介(第十章) 1.Executor框架的两级调度模型 在HotSpot VM的线程模型中

小皮皮LL的博客 1174
上一篇: mybatis 自定义别名的3种方式
下一篇: 前端注意点
心灵泽尘
博客等级 码龄10年 32粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值