首页 > 其他分享 >什么是ExecutorService

什么是ExecutorService

时间:2024-09-15 15:52:17浏览次数:12  
标签:ExecutorService 创建 什么 任务 线程 executor 执行

ExecutorService 是 Java 中用来管理和执行多线程任务的一种高级工具。可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处理大量并发任务时尤为有用。


生动形象的比喻,ExecutorService 就像是一个管理者,你可以把任务交给它,它会根据需要创建线程,并且确保任务按照你的要求执行。


在实际编程中,可以通过 ExecutorService 来避免直接操作线程,这样做通常更安全和更高效。


可以创建一个 ExecutorService 并告诉它需要执行的任务,ExecutorService 会根据需要创建线程,并在执行完任务后将线程回收以便重用,这样可以节省资源并提高性能。


看一个简单的例子:


假设有一个需要处理大量数据的任务,可以创建一个 ExecutorService,并告诉它希望同时执行多少个任务。ExecutorService 会根据设定的自动创建和管理线程,确保这些任务可以并发执行而不会互相干扰。这种方式比手动管理线程更容易,并且可以更好地利用计算机的多核处理能力。


// 创建一个固定大小的线程池,最多同时执行两个任务

ExecutorService executor = Executors.newFixedThreadPool(2);


// 提交两个任务给线程池执行

executor.submit(() -> {

   System.out.println("任务1 正在执行...");

   // 这里放置任务1的具体代码逻辑

});


executor.submit(() -> {

   System.out.println("任务2 正在执行...");

   // 这里放置任务2的具体代码逻辑

});


// 关闭线程池

executor.shutdown();


 

二、ExecutorService的核心功能

创建固定大小的线程池

// 创建一个包含5个线程的固定大小线程池

ExecutorService executor = Executors.newFixedThreadPool(5);

1

2

使用场景: 当需要限制同时执行的线程数量时,可以使用固定大小的线程池。这样可以控制并发线程数量,避免系统资源被过度消耗。


创建可缓存的线程池

// 创建一个可根据需要自动扩展的线程池

ExecutorService executor = Executors.newCachedThreadPool();

1

2

使用场景: 当有大量短期异步任务需要处理时,可以使用可缓存线程池。它会根据任务的增加自动创建新线程,并在空闲时重用现有线程,从而提高性能。


提交 Runnable 任务

executor.submit(() -> {

   System.out.println("执行任务1");

   // 这里放置任务1的具体代码逻辑

});

 

使用场景: 当需要执行没有返回值的简单任务时,可以提交实现了 Runnable 接口的任务。例如,清理临时文件、发送通知等异步操作。


提交 Callable 任务并获取结果

Future<Integer> future = executor.submit(() -> {

   System.out.println("执行任务2");

   // 这里放置任务2的具体代码逻辑

   // 返回任务执行结果

   return fu;  

});


try {

   // 获取任务执行结果,可能会阻塞直到任务完成

   Integer result = future.get();  

   System.out.println("任务2 的结果是:" + result);

} catch (InterruptedException | ExecutionException e) {

   e.printStackTrace();

}

 

使用场景: 当需要执行有返回值的任务,并且可能需要等待任务完成后获取结果时,可以提交实现了 Callable 接口的任务,并使用 Future 对象获取任务的返回值。


扩展:


Future 接口提供了一个特殊的阻塞方法 get(),它返回 Callable 任务执行的实际结果,但如果是 Runnable 任务,则只会返回 null。


如果调用get()方法时任务仍在运行,那么调用将会一直被执阻塞,直到任务正确执行完毕并且结果可用时才返回。


get() 方法是阻塞的,而且并不知道要阻塞多长时间。因此可能导致应用程序的性能降低。如果结果数据并不重要,那么我们可以使用超时机制来避免长时间阻塞。


// 等待 200 毫秒

String result = future.get(200, TimeUnit.MILLISECONDS);

 

这个get() 的重载,第一个参数为超时的时间,第二个参数为时间的单位。


控制线程池的关闭

// 平稳关闭线程池,等待所有任务执行完成

executor.shutdown();

 

使用场景: 当不再需要使用 ExecutorService 时,应该调用 shutdown() 方法来关闭线程池。确保已提交的任务能够完成执行,避免资源泄漏和任务丢失的问题。


标签:ExecutorService,创建,什么,任务,线程,executor,执行
From: https://blog.51cto.com/u_16270487/12024476

相关文章

  • 如何创建和使用ExecutorService
    使用Executors工厂类来创建不同类型的ExecutorService。newFixedThreadPool(intn)可以创建一个固定大小的线程池。newCachedThreadPool()则可以创建一个根据需要自动扩展的线程池。实际案例:创建一个简单的多线程程序,使用ExecutorService执行一批任务,并获取它们的执行结果。......
  • 帝国cms 日期目录 生成函数是什么
    在帝国CMS中,日期目录通常用于组织和存储生成的静态页面文件。日期目录的生成函数并不是直接提供的一个函数,而是通过帝国CMS的后台设置和模板标签来实现的。当你在帝国CMS后台进行栏目设置时,可以选择不同的目录存放形式。例如,你可以设置内容页目录存放形式为包含日期的形式,这样生......
  • AI 框架作用是什么?
    AI框架作用深度学习范式主要是通过发现经验数据中,错综复杂的结构进行学习。通过构建包含多个处理层的计算模型(网络模型),深度学习可以创建多个级别的抽象层来表示数据。例如,卷积神经网络CNN可以使用大量图像进行训练,例如对猫狗分类去学习猫和狗图片的特征。这种类型的神经网络通......
  • 数据中台过时了?为什么现在都在说数据飞轮?
    近年来,随着企业数字化转型的深入,数据的作用愈发凸显,特别是在现代商业竞争中,数据被视为关键资产。过去几年,数据中台的概念备受企业推崇,旨在解决数据孤岛和数据管理问题。然而,随着业务环境的快速变化和技术的发展,越来越多的企业发现,数据中台的传统架构在某些方面已经跟不上实际业务需......
  • .NET 的 Native AOT 现在是什么样的?
    今天要写的这篇文章源自昨天在朋友圈发的文章《UWP通过.NET9和NativeAOT的支持实现UWP应用的现代化》[1],一位小伙伴的对话让我想全面梳理下NativeAOT的现在的进展。.NET9的NativeAOT(Ahead-of-TimeCompilation)是微软在.NET9版本中重点发展的一项技术,旨在提升应用程......
  • 曾经的王者-腾讯公众号为什么不火了呢?
    微信公众号,曾经是图文内容创作者的天堂,如今却似乎风光不再。随着短视频和直播等新型媒体形式的崛起,公众号的打开率连年下滑,粉丝负增长甚至成为一些账号的常态。为何曾一度被誉为“图文类博主巅峰”的公众号会陷入如此境地?具体分析如下:外部竞争加剧短视频的冲击:短视频平台如抖......
  • 响应式网站的网站建设,需要注意什么?
    响应式网站建设需要注意多个方面,以确保网站能够在各种设备和屏幕尺寸上提供一致且良好的用户体验。下面详细介绍响应式网站建设的注意事项:响应式网站的网站建设,需要注意什么?考虑多终端适配设计样式:在设计响应式网站时,应考虑不同设备的显示效果,避免设计过于特殊的样式。前端......
  • 第二十讲:为什么我只改一行的语句,锁这么多?
    第二十讲:为什么我只改一行的语句,锁这么多?简概引入​ 在上一篇文章中,我和你介绍了间隙锁和next-keylock的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。所以今天,我们就先从这个加锁规则开......
  • 高级java每日一道面试题-2024年9月09日-数据库篇-事务提交后数据仍然没有持久化,可能的
    如果有遗漏,评论区告诉我进行补充面试官:事务提交后数据仍然没有持久化,可能的原因是什么?我回答:在Java高级面试中,讨论事务提交后数据仍然没有持久化的问题是一个很好的切入点,可以帮助考察候选人对事务管理、持久化机制以及潜在的编程和配置错误的理解。下面详细解释可能......
  • 高级java每日一道面试题-2024年9月08日-前端篇-JS的执行顺序是什么样的?
    如果有遗漏,评论区告诉我进行补充面试官:JS的执行顺序是什么样的?我回答:JavaScript的执行顺序是由其特殊的执行环境所决定的。JS的执行环境包括全局执行环境、函数执行环境和eval执行环境。在这些环境中,变量和函数声明会被提升(hoisting),而变量赋值和函数调用则按照......