1、public interface ScheduledExecutorService extends ExecutorService 延迟或定期执行任务。
今天来分享一下任务调度,任务调度在我们项目中是不可避免的,只是不同的场景,不同的业务复杂程度和业务要求,我们会使用不同的任务调度实现,而任务调度的实现方式以及框架有很多,在Java语言层面,可以使用Timer类来实现,也可以使用定时线程池ScheduledExecutorService来实现,如果使用Spring框架,可以使用注解@Scheduled配合CRON表达式来实现任务调度,现成的框架我们可以使用Quartz,xxl-job,Elastic-Job,PowerJob等。
今天,我们将探索一个 Java 代码片段,演示如何使用 ScheduledExecutorService 安排任务定期执行。下面是实现调度的代码:
第一次执行任务的延时时间(initialDelay),周期执行的时间间隔(period)。
定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式。
ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
ScheduledExecutorService,是基于线程设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去并行执行
以前写文章的时候忘了标记原创,导致最近整理文章的时候会发现不是原创的文章不给自己权限合入对应目录了,这也是自己后面慢慢开始注重这方面的积累了,读过我的文章的读者应该都知道我喜欢在文章的标题前加一个前缀"java进阶|xxx"。
ScheduledExecutorService类顾名思义,就是可以延迟执行的Executor。如果,对于某些任务,我们并不想马上执行,而是想让任务过一段时间后才执行,或者让任务进行周期性执行。我们就可以采用ScheduledExecutorService类。
ScheduledExecutorService,我平时没有用过,他的最大优点除了线程池的特性以外,可以实现循环或延迟任务。
本节探讨定时任务,定时任务的应用场景是非常多的,比如: 闹钟程序或任务提醒,指定时间叫床或在指定日期提醒还信用卡 监控系统,每隔一段时间采集下系统数据,对异常事件报警 统计系统,一般凌晨一定时间统计昨日的各种数据指标 在Java中,有两种方式实现定时任务: 使用java.util包中的Timer和TimerTask 使用Java并发包中的ScheduledExecutorService 它们的基本用法都是比较简单的,但如果对它们没有足够的了解,则很容易陷入其中的一些陷阱,下面,我们就来介绍它们
Executors框架是Doug Lea的神作,通过这个框架,可以很容易的使用线程池高效地处理并行任务。
在 Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的单线程版本,它的用法和 ScheduledThreadPool 是一样的,所以本文重点来看 ScheduledThreadPool 线程池的使用。 ScheduledThreadPool 执行定时任务的方法有以下 3 个:
在Spring Boot应用程序中,通过使用定时器可以实现定期执行计划任务的功能。Spring Boot提供了@Scheduled注解来简化定时器的编写,而Cron表达式则是一种在特定时间点执行任务的通用方式。本文将介绍如何在Spring Boot应用程序中使用动态Cron表达式来执行定时器任务。
newScheduledThreadPool() 或者newSingleThreadScheduled-Executor()方法:延迟执行、周期性执行的执行器 如果想在某一段时间之后执行线程操作,或者周期性地重复执行线程操作,则可以使用工厂类Executors的newScheduledThreadPool()方法或者 newSingleThreadScheduled-Executor()方法。 newScheduledThreadPool()方法使用给定数目的线程来调度执行任务,而newSingleThreadScheduledExecutor()方法在一个单独的线程中调度任务。 这两个方法都将返回一个ScheduledExecutorService线程池对象。 ScheduledExecutorService接口 ScheduledExecutorService接口从ExecutorService接口继承而来,可用于在给定的延迟后运行的某个任务,或者周期性的执行某个任务。 schedule()方法用于创建并执行给定的延迟的任务,返回的ScheduledFuture对象可以取消执行,或检查执行状态。scheduleAtFixedRate 和scheduleWithFixedDelay用于创建并执行一个周期性或者 固定延迟任务,直到任务取消。 在schedule()方法中,延迟时间一般大于0,但也允许取值为0或者负数(非周期性执行),在这种情况下,认为是立刻执行。 TimeUnit 用于指明时间单位,时间都是相对的时间,而不是绝对的时间。例如,在某一个日期之后运行,则可以使用下面的语句。 scheduled(commad,date.getTime() -System.currentTimeMills,TimeUnit.MILLISECONDS) ScheduledFuture接口 ScheduledExecutorService接口的4个方法都将返回ScheduledFuture对象,ScheduledFuture也是一个接口,他从Delay和Future接口继承而来,表示一个延迟的、结果可接受的操作。 该接口的getDelay方法用于获得延迟时间,get()方法用于获得操作结果,cancel()方法用于取消一个任务。
Executors 框架是整个JUC 包中类/接口关系中最为复杂的框架,真正理解Executors框架的前提是理清楚各个模块之间的关系,高屋建瓴,从整体到局部才能透彻理解各个模块的功能和背后设计的思路!
工作中常常会有定时任务的开发需求,特别是移动端。最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的退出。
现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了。
Executors类是Java并发工具包(java.util.concurrent)中提供的一个工具类,用于创建和管理线程池。它提供了一些静态方法,用于创建不同类型的线程池,简化了线程池的创建和配置过程。
java.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子:
定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的API供开发者调用,在Java中,实现定时任务有很多种方式,原生的方式实现一个完整定时任务需要由Timer、TimerTask两个类,Timer是定时器类,用来按计划开启后台线程执行指定任务,TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。除此之外,还可以用ScheduledExecutorService类或者使用第三方jar库Quartz,其中Quartz是一个优秀的定时任务框架,发展至今已经非常成熟,以致后来其他的定时任务框架的核心思想或底层大多源于Quartz。
从名字来看,Executor 可译为“执行器”,它的作用就是执行任务。该接口只有一个 execute 方法:
SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。
Hello~各位读者新年好!这里楼下小黑哥给大家拜个年,祝大家蒸蒸日上烫烫烫,年年有余屯屯屯。
学习ScheduledExecutorService类创建的newScheduledThreadPool相关用法
在我们日常开发中,经常会遇到 数据定时增量同步、定时发送邮件、爬虫定时抓取 的需求;这时我们可以采用定时任务的方式去进行工作…..
线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们
之前的文章中,我们知道了RocketMQ中的一些核心概念,例如Broker、NameServer、Topic和Tag等等。Producer从启动到发送消息的整个过程,从源码级别分析了Producer在发送消息到Broker的时候,是如何拿到Broker的数据的,如何从多个MessageQueue中选择对应的Queue发送消息。
本文进行JavaSE基础内容:Executor执行器体系的整体介绍。该文是整体框架介绍,并非局限于某一个使用的细节。由于我不止一次的被咨询说ExecutorService和ScheduledExecutorService什么区别和联系,以及ThreadPoolExecutor和ThreadPoolTaskExecutor有什么不一样之类的问题,因此决定写此文科普一下。
定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过期的数据,定时发送邮件等等,实现定时任务调度的方式也十分多样,本篇文章主要学习各种实现定时任务调度方式的优缺点,以便为日后选择的时候提供一定的参考。
java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务。因此一个 ExecutorService 很类似于一个线程池。实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现。
上篇文章,我们讲解了通过Thread和 Runnable 使用线程的方法,并且演示了如何创建一个线程并启动,今天我们来聊一聊多线程中的线程池。
juc-executors框架是整个J.U.C包中类/接口关系最复杂的框架,真正理解executors框架的前提是理清楚各个模块之间的关系,高屋建瓴,从整体到局部才能透彻理解其中各个模块的功能和背后的设计思路。
说到定时任务,通常会想到JDK自带的定时线程来执行,定时任务。 回顾一下定时线程池。
在项目中,我们常常需要在特定的时间执行一些任务,比如定时删除服务器存储的数据缓存,定时获取数据以及定时发送推送等等。
在我们日常开发中,经常会遇到 数据定时增量同步、 定时发送邮件、 爬虫定时抓取 等需求;这时我们可以采用 定时任务的方式去进行工作.....
我们在上一篇学习了ThreadPoolExecutor的实现原理:Java并发包源码学习系列:线程池ThreadPoolExecutor源码解析
这也是我们最常用的 sleep 休眠大法,不只是当作休眠用,我们还可以利用它很轻松的能实现一个简单的定时任务。
继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog.
先来个传统的Timer的例子: package com.jerry.concurrency; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TraditionalTask { public stati
Java中创建和玩转定时任务 定时任务,在日常工作中,可以说是一个算是一个常见的需求场景,比如定时数据校验,数据报表输出,报警等 0. 前言 前面一篇博文《Java并发学习之四种线程创建方式的实现与对比》, 有朋友指出线程池的方式应该算不上新的方式,而应该把Timer方式创建线程加上 这个却是我个人见识不够,写的时候没有想到Timer这种场景了,所以说分享学习记录,不仅仅可以帮助别人,自己也会因此收益 感谢@超大小龙虾 的指正,同时欢迎各位大侠对小弟多多指教 I. 定时任务创建的几种方式 这里给出几种个人
ScheduledExecutorService 是 Java 标准库提供的一个用于调度定时任务的接口。它提供了一种相对简单的方式来执行定时任务,不需要引入额外的库。
ScheduledThreadPoolExecutor 也是一个线程池类,是线程池类 ThreadPoolExecutor 的子类。除了 ThreadPoolExecutor 相关的方法之外,它还增加了执行定时任务和周期性任务的方法。它的类签名和继承结构如下:
在开始正题之前,先闲聊几句。有人说,计算机科学这个学科,软件方向研究到头就是数学,硬件方向研究到头就是物理,最轻松的是中间这批使用者,可以不太懂物理,不太懂数学,依旧可以使用计算机作为自己谋生的工具。这个规律具有普适应,再看看“定时器”这个例子,往应用层研究,有 Quartz,Spring Schedule 等框架;往分布式研究,又有 SchedulerX,ElasticJob 等分布式任务调度;往底层实现研究,又有不同的定时器实现原理,工作效率,数据结构…简单上手使用一个框架,并不能体现出个人的水平,如何与他人构成区分度?我觉得至少要在某一个方向有所建树:
几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损。还记得多年前在做金融系统时,出款业务是通过定时任务对外打款,当时由于银行接口处理能力有限,外加定时任务使用不当,导致发出大量重复出款请求。还好在后面环节将交易卡在了系统内部,未发生资损。
应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别,不用重启应用就可以生效
RxJava的被观察者在使用操作符时可以利用线程调度器--Scheduler来切换线程,例如
领取专属 10元无门槛券
手把手带您无忧上云