Java提供Timer和ScheduledThreadPoolExecutor两个类实现定时任务,其中Timer简单易用,但所有任务都是由同一个线程来调度,任务串行执行,任务之间存在互相干扰,一是前一个任务的延迟会导致后面的任务延迟,二是前一个任务异常导致后面的任务不再执行,三是Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化,执行行为也会出现变化。

鉴于Timer的缺陷,Java 5提供了ScheduledThreadPoolExecutor实现定时任务,每个任务由线程池中一个线程去执行,任务并发执行,且相互之间不会受到干扰。此外,ScheduledExecutorService是基于时间延迟,不会由于系统时间的改变发生执行变化。但ScheduledThreadPoolExecutor要在某个时间点开始执行任务没有Timer方便,需要先计算出和执行时间点的时间差,然后设置第一次启动的延时。

综上,对于复杂的调度,最好是使用开源软件,如Quartz。对于普通的周期性任务,使用ScheduledThreadPoolExecutor就可以满足要求,但使用ScheduledThreadPoolExecutor时,必须注意两点:

1. 一定要使用try{}catch(Throwable t){}捕获所有可能的异常,因为ScheduledThreadPoolExecutor会在任务执行遇到异常时取消后续执行。

2. 注意scheduleAtFixedRate与scheduleWithFixedDelay的区别,scheduleAtFixedRate是上一个任务开始执行之后延迟设定时间再执行,是从上一个任务开始时计时,但对于运行时长超过延迟时长的任务,会等上一个任务执行完之后,下一个任务才开始执行,此时,延时没有任何意义。而scheduleWithFixedDelay是在上一个任务结束执行之后延迟设定时间再执行,是从上一个任务结束时开始计算。

转载于:https://blog.51cto.com/wangzhichao/1716660

Java定时任务以及ScheduledThreadPoolExecutor需要注意的问题相关推荐

  1. Java定时任务技术分析

    <从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...

  2. Java 定时任务详解

    文章目录 单机定时任务技术选型 Timer ScheduledExecutorService Spring Task 时间轮 分布式定时任务技术选型 Quartz Elastic-Job XXL-JO ...

  3. Java定时任务(2)

    Java定时任务(2) 上次浅显的分析了Timer及TimerTask的调度原理,这里我们再来看一下另一种定时调度方式ScheduledThreadPoolExecutor的内部执行原理. Sched ...

  4. java定时任务,每天定时执行任务

    java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager {//时间间隔private static final long PERIOD_DA ...

  5. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  6. Springboot2 Quartz实现JAVA定时任务的动态配置

    动态配置Quartz.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 文章目录 一.需求背景 1. 问题现象 2. 问题分析 3. 解决方案 二.需求背景 2.1. maven依 ...

  7. Java定时任务解决方案

    Java定时任务解决方案 参考文章: (1)Java定时任务解决方案 (2)https://www.cnblogs.com/zhixiang-org-cn/p/9490877.html (3)http ...

  8. Java定时任务(一) Timer及TimerTask的案例解析及源码分析

    Java定时任务(一)  Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...

  9. JAVA定时任务的简单实现

    Java定时任务的简单实现 2011-01-02 18:34:43|  分类: 软件开发 |  标签:void  timer  import  param  dateutil   |字号大中小 订阅 ...

最新文章

  1. C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)
  2. C语言基础:时间转换成字符串 strftime的代码
  3. Asp.net Ajax AlwaysVisibleControl使用方法
  4. windows7用VMware workstation安装ubuntu server 16.04 虚拟机
  5. 如何给域里的每台电脑分配一个***远程访问IP地址
  6. c语言程序运行时可以从键盘上读入,C语言程序设计题库之
  7. 答对10个算我输,示波器基础100问
  8. Diffusion model—扩散模型
  9. android 半透明色值_Android应用中设置alpha值来制作透明与渐变效果的实例
  10. python英文情绪识别_Python能识别文字情绪?
  11. juniper防火墙软件升级
  12. 大数据的“多维度”与“时效性”
  13. SDN — OpenvSwitch 常用指令和应用示例
  14. 北京大学暑期学校总结
  15. Erlang程序设计笔记---(第三节 Erlang的基本概念)
  16. Python爬虫基础-mysql数据库
  17. 「独立思考」的背后是一个残酷的世界
  18. danpianji与ros通信_ROS和Arduino通讯新模式——StandardFirmata
  19. python爬取微博热门消息(一)——效果展示
  20. 王阳明:人心本是光明之镜 奈何因私欲黯淡无光

热门文章

  1. 网络协议分析 | 传输层 :史上最全UDP、TCP协议详解,一篇通~
  2. leetcode94 二叉树的中序遍历
  3. Abstract Self-Balancing Binary Search Tree
  4. Pytorch(1)-内置/自己设计的损失函数使用
  5. pandasStudyNoteBook
  6. python预测股票价格tushare_用tushare对股票进行简单分析
  7. 目前基于区块链的档案防篡改系统的设计如何实现防篡改
  8. 解决:Chrome 插件安装时提示 程序包无效:“CRX_HEADER_INVALID“
  9. C#实现像微信PC版一样的扫码登录功能
  10. tr069相关协议说明