一、用java.util.Timer

使用JAVA类Timer可实现简单的延迟和周期性任务,其中的任务使用java.util.TimerTask表示。任务的执行方式有两种:

按固定速率执行:即scheduleAtFixedRate的两个重载方法

Timer timer = newTimer();

timer. scheduleAtFixedRate(newTimerTask() {

@Overridepublic voidrun() {

System.out.println("Timer is running");

}

},2000, 5000);

按固定延迟执行:即schedule的4个重载方法

Timer timer = newTimer();

timer.schedule(newTimerTask() {

@Overridepublic voidrun() {

System.out.println("Timer is running");

}

},2000);

我们要实现一个定时任务,只需要实现TimerTask的run方法即可。每一个任务都有下一次执行时间nextExecutionTime(毫秒),如果是周期性的任务,那么每次执行都会更新这个时间为下一次的执行时间,当nextExecutionTime小于当前时间时,都会执行它。

Timer的缺陷

1、由于执行任务的线程只有一个,所以如果某个任务的执行时间过长,那么将破坏其他任务的定时精确性。如一个任务每1秒执行一次,而另一个任务执行一次需要5秒,那么如果是固定速率的任务,那么会在5秒这个任务执行完成后连续执行5次,而固定延迟的任务将丢失4次执行。

2、如果执行某个任务过程中抛出了异常,那么执行线程将会终止,导致Timer中的其他任务也不能再执行。

3、Timer使用的是绝对时间,即是某个时间点,所以它执行依赖系统的时间,如果系统时间修改了的话,将导致任务可能不会被执行。

二、使用ScheduledThreadPoolExecutor

由于Timer存在上面说的这些缺陷,在JDK1.5中,我们可以使用ScheduledThreadPoolExecutor来代替它,使用Executors.newScheduledThreadPool工厂方法或使用ScheduledThreadPoolExecutor的构造函数来创建定时任务,它是基于线程池的实现,不会存在Timer存在的上述问题,当线程数量为1时,它相当于Timer。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

scheduledThreadPool.schedule(newRunnable() {public voidrun() {

System.out.println("delay 3 seconds");

}

},3, TimeUnit.SECONDS);

scheduledThreadPool.scheduleAtFixedRate(()->System.out.println("delay 1 seconds, and excute every 3 seconds")

,1, 3, TimeUnit.SECONDS);

java 定时任务只执行一次_Java执行定时任务相关推荐

  1. java代码执行linux命令_java执行Linux命令的方法

    本文实例讲述了java执行Linux命令的方法.分享给大家供大家参考.具体实现方法如下: public class StreamGobbler extends Thread { InputStream ...

  2. java实现失败重试多次_Java执行任务有多次重试和超时

    我认为,但我认为,如果您正在安排与网络相关的任务,则不应重试,而应最终并行运行.我稍后会描述其他方法. 关于您的代码,您应该将任务传递给执行程序,或将FutureTask传递给线程.它不会产生一个线程 ...

  3. java控制电脑发出报警信息_java程序定时任务做数据报警

    1.启动类注入线程 @Bean(value = "taskExecutor") public Executor taskExecutor() { ThreadPoolTaskSch ...

  4. java 日期只计算年月日大小_java 日期加减天数、月数、年数的计算方式

    因为某个项目需要统计 近1周.近1个月.近6个月 等数据,所以在时间的加减上面想了很多方式,最后决定用java.util.Calendar java.util.Calendar ,提供了计算时间的方式 ...

  5. java语言只保留了什么_java语言的保留的关键字【小白必读】

    关键字是编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字.和其他语言一样,Java中保留了许多关键字,例如, class. public等,下面列举的是Java中所有的关键字. abstrac ...

  6. java 日期只计算年月日大小_Java 计算两个日期相差多少年月日

    JDK7及以前的版本,计算两个日期相差的年月日比较麻烦. JDK8新出的日期类,提供了比较简单的实现方法. /*** 计算2个日期之间相差的 相差多少年月日 * 比如:2011-02-02 到 201 ...

  7. java 日期只计算年月日大小_Java按自然月计算两个日期相差的年月日?

    曾经我以为计算两个日期之差很简单,在给我的团队成员分配任务时,也觉得就是调用一个方法的问题,可是当我发现结果老是不对时,才发现原来JDK 提供的API中根本没有这样的方法,我也很恼火,也怪不得不少牛人 ...

  8. java怎么碰到异常跳过继续执行_Java异常处理很难吗?BAT大厂的架构师是怎么处理Java异常的?...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  9. java的tey语句return了_Java finally语句到底是在return之前还是之后执行?

    网上有很多人探讨Java中异常捕获机制try-catch-finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语 ...

最新文章

  1. ubuntu安装vmware(支持mac)与卸载
  2. 『骑士精神 IDA*』
  3. 1250 Fibonacci数列(矩阵乘法快速幂)
  4. [转]JVM运行时内存结构
  5. 康美药业财务造假给股民造成的损失,股民该怎么办?
  6. 程序猿误区:程序员只负责编码
  7. 完全二叉树子节点个数
  8. kafka消费报错:org.apache.kafka.common.errors.WakeupException: null
  9. 编程之美——3.1字符串移位包含问题
  10. window.print()在页面全部加载完成后才能执行。切记。
  11. spring源码-自动注入
  12. python运维和开发实战-高级篇
  13. 大学英语精读第三版(第六册)学习笔记(原文及全文翻译)——6B - John Thomas’s Cube(约翰·托马斯的立方体)
  14. Android多屏幕适配之字体大小、行间距和字间距
  15. 理解线性代数,矩阵运算,行列式
  16. Cronlog日志分割器
  17. VC中自定义打印调试信息函数,打印调试信息到DebugView上
  18. display、visibility和opactity的区别
  19. 【Python | Networks库详解】最佳实践(22年电工杯B题之路径可视化)
  20. 修复固件损坏的RT-ICG2000-AC-CTC路由器(H3C生产)

热门文章

  1. vue + css3实现微信录制播放语音效果
  2. 全球最厉害的14位程序员!你都认识谁?
  3. 【 日常 】 马跳日问题 18年3月17日18:09 [ 12 ]
  4. 【JS】创建和添加节点示例
  5. 记大型商业软件国土档案管理信息系统之系统简介
  6. 热点丨关闭代扣通道,影响的是谁?
  7. 铁氧体材质PC40和PC95特性对比
  8. 毕业论文参考文献标注的几种解决办法
  9. 选择大于努力-----计算机院校择校
  10. 电子眼工作原理(防拍)