【保密】ScheduledThreadPoolExecutor全面解析- 程序员古德
内容摘要
ScheduledThreadPoolExecutor可以高效地管理和复用线程资源,避免创建和销毁大量线程的开销,同时提供灵活的任务调度机制,支持延迟和定频执行。满足各种复杂场景的需求。
官方文档:https://docx.iamqiang.com/jdk11/api/java.base/java/util/concurrent/ScheduledThreadPoolExecutor.html
核心概念
ScheduledThreadPoolExecutor是一个非常实用的工具,它允许您按照预定的计划执行命令和任务。如果您有一个电子商务平台,您需要确保您的系统能够随着“双十一”购物狂欢节的临近而正常运行。它可以处理许多计划任务,例如发送促销提醒、检查订单状态和更新库存。
例如(模拟业务场景),如果您想在双十一午夜向所有注册用户发送促销短信,提醒他们来购物,则不需要为每个用户设置单独的计时器。只需使用ScheduledThreadPoolExecutor 即可。再比如,系统还可以定期检查未付款的订单,如果订单超时未付款,则自动取消订单。让ScheduledThreadPoolExecutor 根据此计划定期运行任务,以固定的时间间隔,例如每5 分钟检查一次。
ScheduledThreadPoolExecutor 允许您轻松管理和调度各种计划任务,确保它们在正确的时间运行,而不必担心由于系统资源不足或任务过多而导致的任务争用。
使用案例
这是一个简单的示例,演示如何使用ScheduledThreadPoolExecutor 在固定延迟后以固定频率重复运行任务,如以下代码所示。
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public static void main(String[] args) { //创建一个ScheduledThreadPoolExecutor 实例。线程池大小ScheduledExecutorService executor=Executors.newScheduledThreadPool(2) //安排任务在一定延迟后运行Runnable LateTask=() - System.out.println('延迟任务在3 秒后运行') ; layedTask, 3, TimeUnit.SECONDS); //安排任务以一定的频率重复运行。 Runnable periodicTask=() - System.out.println('每2 秒运行一次的周期性任务');scheduleAtFixedRate(periodicTask, 0 , 2, TimeUnit.SECONDS); //为了演示目的,将主线程设置为常量Let它会休眠一段时间并观察ScheduledThreadPoolExecutor 的行为try { TimeUnit.SECONDS.sleep(10) } catch (InterruptedException) e) { e.printStackTrace() } //executor.shutdown(); try { if (! executor.awaitTermination(800, TimeUnit.MILLISECONDS)) { executor.shutdownNow() } } catch (InterruptedException) e) { executor.shutdownNow(); } } } 在上面的代码中,创建了一个ScheduledExecutorService 实例并线程池大小为2,安排了两个任务。一种是延迟任务,在3 秒后运行。另一个是每2 秒运行一次的周期性任务。
您将得到以下输出。
定时任务每2 秒运行一次定时任务每2 秒运行一次延迟任务3 秒后运行定时任务每2 秒运行一次定时任务每2 秒运行一次:010 -1010 ScheduledThreadPoolExecutor 是ThreadPoolExecutor 的子类,专门用于执行指定延迟后的任务。运行命令或定期运行命令。接下来我们简单介绍一下ScheduledThreadPoolExecutor的一些重要方法。
Schedule(可执行命令,长延迟,以TimeUnits 为单位):安排单个命令在指定的延迟后运行。命令是要执行的任务。 Delay是执行任务之前的延迟时间,unit是延迟时间的单位。 (例如,TimeUnit.SECONDS 代表秒)并返回一个ScheduledFuture,允许您在任务尚未开始时取消该任务。 ScheduleAtFixedRate(Runnable command,longInitialDelay,long period,TimeUnitunit), 安排重复任务以固定频率运行。命令是要执行的任务。 initialDelay是任务第一次执行之前的延迟时间。 period 是连续任务执行之间的循环时间。单位是时间单位。返回ScheduledFuture。该对象可以取消任务。注意:如果任务运行时间超过指定的持续时间,则下一次运行可能会延迟。但绝不会同时发生。 ScheduleWithFixedDelay(Runnable command,longInitialDelay,longlay,TimeUnitunit) 安排任务定期运行,但在每个运行命令运行该任务后有一个固定的延迟,并且在任务第一次运行之前有一个固定的延迟。延迟时间。延迟是任务执行完成与下一个任务开始之间的时间延迟。单位是小时。返回ScheduledFuture。该对象可以取消任务。注意:与scheduleAtFixedRate不同,scheduleWithFixedDelay保证下一个任务之间的延迟。不是任务和任务启动的时间间隔。 shutdown() 启动执行器的正常关闭。使用这种方法,执行器将不再接受新任务,而是完成所有排队的任务。 shutdownNow() 尝试停止所有正在运行的任务,暂停处理尚未开始处理的任何任务,并返回到等待运行的任务列表。如果执行器关闭,isShutdown() 返回true。如果执行器关闭后所有任务都完成,则isTermminate() 返回true。 waitTermination(long timeout, in TimeUnit),请求关闭正在终止的执行器,等待指定时间,直到执行器完成所有任务,执行器在指定时间内完全终止如果是则返回true,否则返回false。 getPoolSize() 返回线程池中的线程数。 getCorePoolSize() 返回线程池核心大小。这是即使在空闲时仍保留在池中的线程数。 setCorePoolSize(int corePoolSize) 设置线程池核心大小。这些核心API 提供对任务调度的细粒度控制,包括任务启动时间、执行频率以及线程池大小和行为。
核心API
【保密】ScheduledThreadPoolExecutor全面解析- 程序员古德
ScheduledThreadPoolExecutor的好处是高效管理线程资源,支持灵活的任务调度,内部可以实现线程池。这避免了与创建和销毁任务相关的开销。如果运行异常,后续调度会默认终止,需要额外添加。使用时,我们建议您明确任务的性质,合理调整线程池的大小,并处理任务之间的依赖关系和异常。
关注我,每天学习互联网编程技术- 程序员古德
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。