学习ScheduledExecutorService类创建的newScheduledThreadPool相关用法
当前任务执行时间大于等于间隔时间,任务执行后立即执行下一次任务。相当于连续执行了。
在 Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的单线程版本,它的用法和 ScheduledThreadPool 是一样的,所以本文重点来看 ScheduledThreadPool 线程池的使用。 ScheduledThreadPool 执行定时任务的方法有以下 3 个:
实际上还是ThreadPoolTaskScheduler的方法,只是封装了一层更适合项目使用
工作中常常会有定时任务的开发需求,特别是移动端。最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的退出。
最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能。说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴。然而quartz框架太重了,小项目根本不好操作啊。当然,也有人会说,jdk提供了timer的接口啊,完全够用啊。但是我们项目的需求完全是多线程的模型啊,而timer是单线程的,so,楼主最后还是选择了jdk的线程池。
一、概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的。在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务,但封装任务的类却是TimerTask类。 通过继承 TimerTask 类 并实现 run() 方法来自定义要执行的任务: public class Mytask extends TimerTask { @Override public void
实现线程的延时调度需要两个对象,一个是负责对任务进行调度的调度对象 Timer,另一个是继承了 TimerTask 对象的自定义的延时调度对象
大家好,又见面了,我是你们的朋友全栈君。 前言 前几天,肥佬分享了一篇关于定时器的文章你真的会使用定时器吗?,从使用角度为我们详细地说明了定时器的用法,包括 fixedDelay、fixedRate,
几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损。还记得多年前在做金融系统时,出款业务是通过定时任务对外打款,当时由于银行接口处理能力有限,外加定时任务使用不当,导致发出大量重复出款请求。还好在后面环节将交易卡在了系统内部,未发生资损。
在java中一个完整定时任务需要由Timer、TimerTask两个类来配合完成。 API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。由TimerTask:Timer 安排为一次执行或重复执行的任务。我们可以这样理解Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
java.base/java/util/concurrent/Executor.java
java 定时器可以用作,定时刷新缓存等。。。。。。。。。。。 timer.schedule(task, firstTime, period); task参数是,TimerTask 类,在包:import java.util.TimerTask .使用者要继承该类,并实现 public void run() 方法,因为 TimerTask 类 实现了 Runnable 接口。 firstTime参数是,当你调用该方法后,该方法必然会调用 TimerTask 类 TimerTask 类 中的 run() 方法,这个参数就是这两者之间的差值,转换成汉语的意思就是说,用户调用 schedule() 方法后,要等待这么长的时间才可以第一次执行 run() 方法。 period参数是,第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。 schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。 schedule import java.util.Timer;
如上述代码所示,启动 10 个调度线程,延迟 10 秒,开始执行定时逻辑,然后每隔 2 秒执行一次定时任务。定时任务类为TaskWorker,其要做的事就是根据offset和rows参数,到数据库捞取指定范围的待处理记录,然后送到TaskService的processTask方法中进行处理。从逻辑上来看,该定时没有什么毛病,但是在执行定时任务的时候,却经常出现卡顿的问题,表现出来的现象就是:定时任务不执行了。
ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便。
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * 说明:java定时器 * 作者:FH Admin * from:fhadmin.cn */ public class TimeTest { public static void main(String[] args) { timer1();
Timer是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,而且是一个抽象类,如下所示:
上一篇讲解了线程池的原理,这篇就在线程池基础上介绍基于线程池实现的定时器ScheduledThreadPoolExecutor:
也就是说,不管是scheduleAtFixedRate还是scheduleWithFixedDealy都会等待上一个任务运行结束再进行下一个任务。如果需要并行执行,可以考虑任务中使用异步处理,比如Spring Boot中的@Async
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
在『任务调度线程池』功能加入之前,可以使用 java.util.Timer 来实现定时功能,Timer 的优点在于简单易用,但 由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个 任务的延迟或异常都将会影响到之后的任务。
其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:
在接口开发时,有一种开发模式叫定时器模式,可以理解为每经过一段预设的时间就会执行一次事件,而在我们的工作中,这个事件所实现的功能一般是将两个系统的数据信息进行同步,这样就实现了两个系统通过接口进行对接的功能。
注意其中最大的区别,在于 schedule 调用 sched 函数时,将传入的 period 取反了。如果某次执行任务的开始时间延后了,那么此后的每次任务都会延迟。
本文介绍了Java多线程编程的核心技术,包括线程池、线程同步、线程通信、定时器等内容。通过实际案例,详细讲解了Java多线程编程中的核心概念和技术。
最近要用到定时任务,就是超过48小时的数据给关闭,前台就不显示了。还是头一次使用java的定时器,。。java定时器使用Timer类。有时间得看下源码了,看看具体咋弄的。
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()方法用于取消一个任务。
2、如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机;
java.util.concurrent.ScheduledThreadPoolExecutor 是 JDK1 .6之后自带的 包,功能强大,能实现定时器和延时加载的功能
点击关注公众号,Java干货及时送达 背景 昨天,咱们的《知识星球:Java技术栈》里面有粉丝向我提问: 问题大概就是: Spring Boot 定时任务开启后,怎么符合条件自动停止? 当时我有空,虽然已经给出了参考答案,但可能还有一些细节地方要注意的,另外,我也觉得这个问题特别有意思,现在特别拿出来整理下,分享下给大家。 1、自定义任务调度 首先覆盖 TaskSchedulingAutoConfiguration 自动配置类里面的 ThreadPoolTaskScheduler Bean: /**
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
定时器是java的一大特色,本篇文章我们会了解定时器的配置有哪些方式,下面就跟小编一起看看吧。
定时任务就是在指定时间执行程序,或周期性执行计划任务。Java中实现定时任务的方法有很多,本文从从JDK自带的一些方法来实现定时任务的需求。
1、public interface ScheduledExecutorService extends ExecutorService 延迟或定期执行任务。
先来个传统的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.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子:
ScheduledExecutorService,我平时没有用过,他的最大优点除了线程池的特性以外,可以实现循环或延迟任务。
Timer和TimerTask是用于在后台线程中调度任务的java util类。简单地说,TimerTask是要执行的任务,Timer是调度器。
java开发,多多少少会接触到多线程的应用开发场景,博主之前做多线程的时候就两种方式,一个是继承Thread一个是实现Runnable接口,不过用的多的还是实现Runnable接口,因为实现Runnable接口可以做多线程资源共享!而java.util.concurrent.ScheduledExecutorService接口将大大简化多线程应用的开发!也能轻松解决任务定时执行的问题!
shedlock-core-0.16.1-sources.jar!/net/javacrumbs/shedlock/core/LockProvider.java
Executors类是Java并发工具包(java.util.concurrent)中提供的一个工具类,用于创建和管理线程池。它提供了一些静态方法,用于创建不同类型的线程池,简化了线程池的创建和配置过程。
公司缓存设计: 1. 希望启动后就进行缓存相关的加载,更新等操作,所以定义了一个继承ApplicationRunner的静态类,在其中写了一些启动后刷新的逻辑,同时用scheduleAtFixedRate做一个定时任务,进行相关的定时刷新.还有主动的刷新方法load,供实时数据的刷新使用 2. 数据要求有一定的实时性,故加了一组消息队列,在其他业务对数据产生变更时,发送mq消息,展示端门户收到mq消息后,主动刷新 第一次产生问题: 经常有一些缓存的时间存活很长,或者当缓存失效后,直接查询数据库 解决方案:
incubator-retired-gossip/gossip-base/src/main/java/org/apache/gossip/manager/AbstractActiveGossiper.java
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
先推荐阅读此篇: 【小家java】Java定时任务ScheduledThreadPoolExecutor详解以及与Timer、TimerTask的区别(执行指定次数停止任务)
领取专属 10元无门槛券
手把手带您无忧上云