ScheduledExecutorService与Timer

Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代 task2实际上是4后才执行,正因为Timer内部是一个线程,而任务1所需的时间超过了两个任务间的间隔导致。由于任务1的一次,任务2也停止运行了。以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理。MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理。MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理。,现在起闭关修炼半个月,争取早日上岸!2、Timer当任务抛出异常时的缺陷。 阅读详情

#

一:简单说明

ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便。

下面是该接口的原型定义

java.util.concurrent.ScheduleExecutorService extends ExecutorService extends Executor

接口scheduleAtFixedRate原型定义及参数说明

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,  
            long initialDelay,  
            long period,  
            TimeUnit unit);  

command:执行线程
initialDelay:初始化延时
period:两次开始执行最小间隔时间
unit:计时单位
接口scheduleWithFixedDelay原型定义及参数说明

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,  
                long initialDelay,  
                long delay,  
                TimeUnit unit);  

command:执行线程
initialDelay:初始化延时
period:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间)
unit:计时单位

二:功能示例

1.按指定频率周期执行某个任务。

初始化延迟0ms开始执行,每隔100ms重新执行一次任务。

/** 
 * 以固定周期频率执行任务 
 */  
public static void executeFixedRate() {  
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);  
    executor.scheduleAtFixedRate(  
            new EchoServer(),  
            0,  
            100,  
            TimeUnit.MILLISECONDS);  
}  

间隔指的是连续两次任务开始执行的间隔。

2.按指定频率间隔执行某个任务。

初始化时延时0ms开始执行,本次执行结束后延迟100ms开始下次执行。

/** 
 * 以固定延迟时间进行执行 
 * 本次任务执行完成后,需要延迟设定的延迟时间,才会执行新的任务 
 */  
public static void executeFixedDelay() {  
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);  
    executor.scheduleWithFixedDelay(  
            new EchoServer(),  
            0,  
            100,  
            TimeUnit.MILLISECONDS);  
}  

3.周期定时执行某个任务。

有时候我们希望一个任务被安排在凌晨3点(访问较少时)周期性的执行一个比较耗费资源的任务,可以使用下面方法设定每天在固定时间执行一次任务。

/** 
 * 每天晚上8点执行一次 
 * 每天定时安排任务进行执行 
 */  
public static void executeEightAtNightPerDay() {  
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);  
    long oneDay = 24 * 60 * 60 * 1000;  
    long initDelay  = getTimeMillis("20:00:00") - System.currentTimeMillis();  
    initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;  

    executor.scheduleAtFixedRate(  
            new EchoServer(),  
            initDelay,  
            oneDay,  
            TimeUnit.MILLISECONDS);  
}  


/** 
 * 获取指定时间对应的毫秒数 
 * @param time "HH:mm:ss" 
 * @return 
 */  
private static long getTimeMillis(String time) {  
    try {  
        DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");  
        DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");  
        Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);  
        return curDate.getTime();  
    } catch (ParseException e) {  
        e.printStackTrace();  
    }  
    return 0;  
}  

4.辅助代码

class EchoServer implements Runnable {  
    @Override  
    public void run() {  
        try {  
            Thread.sleep(50);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("This is a echo server. The current time is " +  
                System.currentTimeMillis() + ".");  
    }  
}  

三:一些问题

上面写的内容有不严谨的地方,比如对于scheduleAtFixedRate方法,当我们要执行的任务大于我们指定的执行间隔时会怎么样呢?

对于中文API中的注释,我们可能会被忽悠,认为无论怎么样,它都会按照我们指定的间隔进行执行,其实当执行任务的时间大于我们指定的间隔时间时,它并不会在指定间隔时开辟一个新的线程并发执行这个任务。而是等待该线程执行完毕。

源码注释如下:

* Creates and executes a periodic action that becomes enabled first  
* after the given initial delay, and subsequently with the given  
* period; that is executions will commence after  
* <tt>initialDelay</tt> then <tt>initialDelay+period</tt>, then  
* <tt>initialDelay + 2 * period</tt>, and so on.  
* If any execution of the task  
* encounters an exception, subsequent executions are suppressed.  
* Otherwise, the task will only terminate via cancellation or  
* termination of the executor.  If any execution of this task  
* takes longer than its period, then subsequent executions  
* may start late, but will not concurrently execute.  

根据注释中的内容,我们需要注意的时,我们需要捕获最上层的异常,防止出现异常中止执行,导致周期性的任务不再执行。

2.与Timer比较

1、Timer管理延时任务的缺陷

a、以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷

2、Timer当任务抛出异常时的缺陷

如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行:

3、Timer执行周期任务时依赖系统时间

Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化会出现一些执行上的变化,ScheduledExecutorService基于时间的延迟,不会由于系统时间的改变发生执行变化。

JDK 定时任务 Timer 与 ScheduledExecutorService 排坑记录 正在认真敲代码的楼主,突然收到数据维护系统发过来的报警邮件说楼主凌晨跑的定时任务没有成功,于是便开始了楼主今天的找坑填坑的过程。 定时任务,关于 Timer 与 ScheduledExecutorService 的抉择 这事肯定会有小伙伴说了为啥不用Quartz啊,因为楼主的庙小啊,就几个定时任务而已Quartz太重了。 Timer 存在的问题 Timer的主要问题在于,如果T... 阅读详情

相关推荐

【Java】 定时任务Timer与ScheduledExecutorService的区别

1.背景 起因是我在Flink Operator中,open方法中添加了一个调度任务,但是采用定时任务ScheduledExecutorService发现不可以 import org.apache.flink.runtime.execution.Environment; import org.apache.flink.runtime.metrics.groups.OperatorMetricGroup; import org.apache.flink.runtime.operators.util.metr.

九师兄 1117

【线程池】ScheduledExecutorService接口和ScheduledThreadPoolExecutor定时任务线程池使用详解

一篇文章带你快速了解ScheduledExecutorService接口和ScheduledThreadPoolExecutor定时任务线程池。

小七的博客 8611

SpringBoot中Timer、ScheduledExecutorService、Spring Task、Quartz的使用

SpringBoot几种定时任务的实现方式:Timer、ScheduledExecutorService、Spring Task、Quartz。

私信可回答各种问题~ 956

JDK自带的定时任务Timer和ScheduledExecutorService详解

首先大概了解一下ExecutorService, ExecutorService其实就是是Java提供的线程池技术,也就是说,每次我们需要使用线程的时候,可以通过ExecutorService获得线程。查看ExecutorService源码,其中得方法主要是使用线程执行任务或者中断线程等,其实就是操作线程得方法,ExecutorService其实是一个接口,具体得实现使用ThreadPoolExecutor。查看源码发现,Timer中内置了一个任务队列和一个调度线程,这2个都是Timer中的内部类。

weixin1734的博客 1513

计算机导论期末知识点及试题总结 [近三万字总结 · 全]

计算机网络:计算机网络是利用通信线路连接起来相互独立的计算机的集合,其主要目的是实现数据通信和资源共享。 计算机病毒:破坏计算机功能或数据,影响计算机使用,并能自我复制的一组计算机指令或程序。 操作系统:操作系统是由程序和数据结构组成的大型系统软件,它负责计算机的全部软硬件的资源分配,调度和管理,控制各类程序的正常执行,并为用户使用计算机提供良好的环境。 高速缓冲储存器(Cache):位于cpu和内存之间的储存器,其特点是速度快,目的是是储存器的速度与cpu的速度相匹配。 总线:若干信号线的集合,是

这个人好有趣....hh 1万+

单片机笔记十二:华大HC32L136超低功耗设计实战

本文详细介绍了华大HC32L136单片机的超低功耗设计实战,包括深度睡眠模式下仅0.5μA的电流消耗、五种功耗模式的对比与配置、外设使用技巧及硬件级优化方法。通过实际项目案例,展示了如何利用ARM Cortex-M0+内核的HC32L136显著延长电池寿命,适用于智能门锁、额温枪等低功耗设备。

weixin_29189373的博客 388

线程池延时类ScheduledExecutorService—比Timer更有效精确的延时工具

ScheduledExecutorService 前言   在Java中我们一般使用Timer来进行延时/周期执行操作,Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间和循环时间就会出现问题。除此之外:在多线程并发执行定时操作时,Timer运行多个TimerTask,如果其中一个任务没有异常没有捕获,那所有任务都将终止。还有就是,Timer是基于绝对时间,而ScheduledExecutorService是基于相对时间的,这个看情况而定,一般基于相对时间更灵活一些。所以作

yuyan_jia的博客 1363

# 解决 win11 连接共享打印机,报错 0x00000709 问题

# 解决 win11 连接共享打印机,报错 0x00000709 问题

段子手168的博客 9万+

ScheduledExecutorService 和 Timer 的区别

Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间和循环时间就会出现问题。ScheduledExecutorService是线程池,所以就不会出现这个情况,在对延迟任务和循环任务要求严格的时候,就需要考虑使用ScheduledExecutorService了。ScheduledExecutorService有三种常用方法: // 通过静态方法创建ScheduledEx...

wangxueqing52的博客 4631

3DMax高效建模与人工智能:一场颠覆传统创作的效率革命

AI与3DMax的结合,不仅是工具效率的升级,更是一场创作范式的革命。从“手动雕刻”到“智能共生”,设计师的角色正从执行者转向决策者。正如网友所言:“AI不是替代人类,而是赋予凡人以神笔。”在这场变革中,唯有拥抱技术、深耕创意,方能在数字艺术的浪潮中立于潮头。参考文献与工具推荐技术原理:火星时代资讯《人工智能和三维建模》工具实测:哔哩哔哩《tyDiffusion 3dsMax应用》9、Tripo AI官网教育案例:原创论文《人工智能技术介入三维动画课程建设》

m0_46478534的博客 3009

AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真_aoa定位算法

如图所示,有基站 S 1 ( x 1 , y 1 , z 1 ) , S 2 ( x 2 , y 2 , z 2 ) S_1(x_1,y_1,z_1),S_2(x_2,y_2,z_2) S1​(x1​,y1​,z1​),S2​(x2​,y2​,z2​),目标 T ( x , y , z ) T(x,y,z) T(x,y,z)。2+(z_1-z_2)^2} step1:两基站间的距离L=(x1−x2)2+(y1​−y2​)2+(z1​−z2​)2。

2401_87555613的博客 1482

Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代

继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog. 1、Timer管理延时任务的缺陷 a、以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两

Hongyang 9万+

【24届数字IC秋招总结】正式批面试经验汇总6——禾赛

15、ahb写或者读的数据存储起来了嘛,ahb读的话,apb这边是怎样的。19、覆盖率收集的时候有没有哪些是很难收集到的,然后写了定向测试。2、C++有学过嘛 还记得C++的什么内容 C++成绩多少。12、config_db机制用过嘛 四个参数的含义。8、脚本语言有学过嘛 简单学过 简单是指代码数少嘛。13、run_phase和mian_phase的区别。10、覆盖机制的创建方法 ,是不是覆盖用的很少。6、call_back机制记得哪些细节的东西。9、uvm实战学了哪些章节 印象深刻的章节。

qq_42135020的博客 1082

Timer与ScheduledExecutorService

Timer与ScheduleExecutorService,二者都代表定时任务。 Timer: public static void main(String[] args) { Timer timer = new Timer(); //继承TimerTask抽象类,覆写run方法,表示一个任务 MyTimerTask timerTask = new MyTimerTask();

nuoWei_SenLin的博客 1万+

【ODX介绍】-5-用于Flash刷写的ODX-F文件概述

用于Flash刷写的ODX-F文件概述

「汽车电子助手」的博客 2530

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2369

使用ScheduledExecutorService替代timer

Timer不支持并发。 Timer不支持多线程。全部挂在Timer下的任务都是单线程的,任务仅仅能串行运行。假设当中一个任务运行时间过长。会影响到其它任务的运行,然后就可能会有各种接踵而来的问题。如果重开一个Timer?难道要为全部的耗时的Task都单开一个Timer。显然是不太可能。这样就太乱了。 Timer的线程不捕获异常。TimerTask假设抛出异常,那么Timer唯一的进程就会挂掉,这...

刘东阳的博客 5723

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

通过ScheduledExecutorService代替Timer

用于记录一下 原来的代码是这样的: //定时器 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { snake.move(); // 重绘棋盘 jPanel.repaint(); }

weixin_46063418的博客 2667

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Timer和ScheduledExecutorService

介绍 Timer和ScheduledExecutorService,可以定时周期性的执行任务 Timer、TimerTask,是被synchronized修饰的线程安全的类 使用ScheduledExecutorService代替Timer吧 多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecut...

thebigdipperbdx的博客 451

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Timer与ScheduledExecutorService间的抉择

多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 阿里巴巴规约扫描提示 Timer执行多个task,当一个task抛出异常所存在缺陷的问题。 由于Timer是单线程的,当执行多个任务时,一个任务抛出异常,接下来的任务就不会再继续执行。 例子一、使用t...

wittdong的博客 1104

Timer延时执行与ScheduledExecutorService的区别

在执行延时执行的时候,Timer抛出异常之后会出现线程终止,无法进行下个线程的执行(利用idea中的插件检测出来的) 上代码 import java.util.Timer; import java.util.TimerTask; public class TimerTest { private Timer timer = new Timer(); public void launchTimer() { timer.schedule(new TimerTask()

leibaoxue的博客 312

Timer单线程的缺陷 用ScheduledExecutorService替代

  1、Timer管理延时任务的缺陷 a、以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷:下面看例子: Timer的源码: [java] view plain copy publ...

.... 永远年轻,永远热泪盈眶 5982

ScheduledExecutorService 和 timer的区别

ScheduledExecutorService 和 timer的区别: 1.前者有线程池 可以支持多个任务并发执行 后者是单线程(当执行任务的时间间隔小于执行任务的时间, timer就会等待上一个任务执行结束才执行下一个) 2.程序运行报错(RuntimeException)时,timer会停止所有任务的运行 3.timer时间间隔是依赖于系统的时间,而前者是基于时间的延迟 ...

linpaipai的博客 932

java Timer和ScheduledExecutorService区别

前面写了java Timer源码走读,算是搞懂了java中Timer的实现原理,之前对于定时任务,一直使用Timer,后来面试中被问到Timer和ScheduledExecutorService什么区别,一脸懵逼,之前都没想到这两个有什么关系。 一开始其实就只把ScheduledExecutorService当做是线程池,只是具备了调度定时任务的能力。但是从使用场景的角度来看,其实这两个确实很像,都是为了调度定时任务而产生的,只是使用的实现方法不一样。 ...

lijianqingfeng的专栏 848

Timer的缺陷 用ScheduledExecutorService替代

1、Timer管理延时任务的缺陷 a、以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷:下面看例子: Timer的源码: public class Timer {     /**    ...

qq_42225507的博客 156
上一篇: 获取最上方应用包名
下一篇: DecimalFormat类使用(快速Format几位小数)
missingcall
博客等级 码龄10年 8粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值