线程管理神器:ScheduledExecutorService全面解析- 程序员古德
内容摘要
ScheduledExecutorService 是一个强大的工具,用于处理Java 中的计划重复任务。它简化了线程管理,自动分配线程资源,避免了手动创建线程的麻烦,可以满足大多数场景。此外,ScheduledExecutorService还支持任务取消和线程池关闭,让您更好地控制线程管理。
官方文档:https://docx.iamqiang.com/jdk11/api/java.base/java/util/concurrent/ScheduledExecutorService.html
核心概念
ScheduledExecutorService 是Java 中一个非常有用的工具。您可以使用它在一定延迟后运行命令或替换Timer 类。
我们来模拟一个例子来说明问题。假设您有一个在线购物平台。该平台允许用户将产品添加到购物车,但购物车中产品的价格可能会发生变化,以确保用户始终拥有可见性。要获取最新的价格,请使用ScheduledExecutorService 定期检查购物车中商品的价格是否已更新,然后在用户打开购物车页面时每隔几分钟运行一次购物车,即可使用任务来进行。自动检查购物车。 (例如,每5 分钟)当此任务检测到特定产品的价格发生变化时,它会更新购物车页面或向用户发送通知,即使用户仍保留在购物车中也可以这样做。您还可以查看价格随时间的变化,而无需手动刷新页面。该功能是通过ScheduledExecutorService 实现的。
如果您的网购平台能够在用户注册后的一定时间内(例如24小时)发送欢迎邮件,您可以使用ScheduledExecutorService将该任务安排在用户完成注册时。任务是发送一封欢迎电子邮件。此电子邮件由ScheduledExecutorService 自动发送。
代码案例
以下代码演示了ScheduledExecutorService 的基本用法。
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public static void main(String[] args) { //创建一个ScheduledExecutorService 实例。对于定时任务ScheduledExecutorService executorService=Executors.newScheduledThreadPool(1) //创建一个周期性运行的Runnable 任务Runnable task=() - { System.out.println('执行任务: ' + System.currentTimeMillis( ));/使用ScheduledExecutorService 的Schedule AtFixedRate 方法来安排任务。 //第一个参数是Runnable对象,第二个参数是第一次运行的延迟时间, //第三个参数是连续运行之间的时间间隔。第四个参数是时间单位executorService.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS); //让主线程等待足够长的时间来监视ScheduledExecutorService 活动//在实际应用程序中:这可能是其他一些逻辑问题执行而不只是等待try { System.out.println('ScheduledExecutorService 已启动。等待任务运行.') ; //等待10 秒以监视任务执行Case } catch (InterruptedException e) { e.printStackTrace(); } //关闭ScheduledExecutorService。这将停止所有正在运行的任务并执行executorService.shutdown(); System.out.println('ScheduledExecutorService 已关闭') }此代码执行以下操作:
在main方法中,创建一个ScheduledExecutorService实例。定义一个打印当前时间戳的可执行任务。使用scheduleAtFixedRate 方法安排任务立即开始运行,然后每2 秒运行一次。主线程等待10秒来监控任务执行情况。最后,关闭ScheduledExecutorService。执行结果如下。
ScheduledExecutorService 已启动并正在等待运行任务. 正在运行的任务: 1633311802123 正在运行的任务: 1633311804125 正在运行的任务: 1633311808125 正在运行的任务: 163331181 ScheduledExecutorService 已终止
核心API
ScheduledExecutorService 是.util.concurrent 包的Java java 接口。扩展ExecutorService 接口以允许在指定延迟后执行命令。这里我们简单描述一下ScheduledExecutorService的一些重要方法。
Schedule(可执行命令,长延迟,以TimeUnits 为单位):安排一个命令在指定的延迟后运行,并返回一个ScheduledFuture 表示一个挂起的任务,如果尚未开始,则可以取消该任务。 ScheduleAtFixedRate(Runnable command,longInitialDelay,long period,TimeUnitunit):在初始延迟后第一次运行,然后定期运行,即在上一次运行完成和运行开始之间有一个固定的时间段命令。下次执行时,如果执行过程中发生异常,则取消后续执行。 ScheduleWithFixedDelay(Runnable command,longinitialDelay,longlay,TimeUnitunit):安排一个命令在初始延迟后首先运行,然后定期运行,但在上一次运行结束和下一次运行开始之间会有一定的延迟。也就是说,实际执行间隔至少等于指定的延迟,或者如果任务执行时间比延迟长,则实际执行间隔更长。 shutdown():启动执行器的正常关闭。先前提交的任务将运行,但如果它们已经关闭,则调用将没有其他效果。 shutdownNow():停止所有正在运行的任务,暂停处理尚未开始运行的任务,并返回尚未开始运行的任务列表。此方法不保证可以停止正在进行的任务。 isShutdown():如果执行器关闭,则返回true。 isTermination():如果执行器关闭后所有任务都完成,则返回true。 waitTermination(long timeout, TimeUnit Unit) 抛出InterruptedException:请求执行器在关闭后等待所有任务完成,直到指定的超时时间。如果超时已过,则返回false;如果所有任务均已完成,则返回true。 ScheduledExecutorService非常适合需要异步并发处理任务的场景,例如定时任务、后台处理、系统监控等。例如,用于处理需要延迟执行、定时执行或执行的任务。在一定时间内重复执行。
核心总结
线程管理神器:ExecutorService全面剖析- 程序员Goode
ScheduledExecutorService最大的优势在于其特殊的内部线程池管理机制,可以让开发者轻松地按照预设的时间表执行任务,而无需手动创建和管理线程。这不仅大大简化了多线程编程的复杂度;然而,有时可以更有效地利用系统资源。一个明显的缺点是无法保证计划任务执行的绝对准确性。特别是在系统资源紧张或并发量较高的场景下,任务执行可能会出现延迟。此外,如果未将线程设置为适当的池参数,高并发时的性能也会受到限制。
关注我,每天学习互联网编程技术- 程序员古德
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。