大家都说Timer不太好用,经常会遇到:如果前边的一个任务比较慢,超出了period,此时timer的下一次轮询也会延迟。

同事说ScheduleExecutorService可以避免该问题,我写个例子测试下:

package com.dx.testparallel;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;;public class TestTimer {public static void main(String[] args){ScheduledExecutorService scheduledExecutorService=Executors.newScheduledThreadPool(1);//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 //initialDelay then initialDelay+period, then initialDelay + 2 * //period, 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.scheduledExecutorService.scheduleAtFixedRate(new TheTask(), 0,1000, TimeUnit.MILLISECONDS);}
}

package com.dx.testparallel;import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;import javax.lang.model.element.VariableElement;public class TheTask implements Runnable{    @Overridepublic void run() {        Timestamp ts = new Timestamp(System.currentTimeMillis());  UUID uuid = UUID.randomUUID();   System.out.println("task"+uuid+" start:"+ts.toString());//          long num=0;
//          for(int a=0;a<100000;a++){
//              for(int i=0;i<1000000;i++){
//                  for(int j=0;j<1000000;j++){
//                      num= a*i*j;
//                  }
//              }
//          }try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();}ts = new Timestamp(System.currentTimeMillis());  System.out.println("task"+uuid+" end:"+ts.toString());}
}

测试结果:为什么每次间隔时间是2s,而不是1s.

task418d088e-3288-4736-b40a-f3c4f496e2a2 start:2016-09-07 00:49:03.699
task418d088e-3288-4736-b40a-f3c4f496e2a2 end:2016-09-07 00:49:05.836
task741d2176-dbef-4f12-a73e-13a04ed5eb18 start:2016-09-07 00:49:05.836
task741d2176-dbef-4f12-a73e-13a04ed5eb18 end:2016-09-07 00:49:07.836
task96ebb6ca-c99b-482e-b608-bd560e89c7eb start:2016-09-07 00:49:07.836
task96ebb6ca-c99b-482e-b608-bd560e89c7eb end:2016-09-07 00:49:09.837
task1ce9f4bb-dd9e-4510-a697-73daef02fe6b start:2016-09-07 00:49:09.837
task1ce9f4bb-dd9e-4510-a697-73daef02fe6b end:2016-09-07 00:49:11.837
task0386a855-3e85-4d06-9d91-24abde228731 start:2016-09-07 00:49:11.837
task0386a855-3e85-4d06-9d91-24abde228731 end:2016-09-07 00:49:13.838
task886fe541-92d1-49bc-b5bd-2c425cf773ba start:2016-09-07 00:49:13.838
task886fe541-92d1-49bc-b5bd-2c425cf773ba end:2016-09-07 00:49:15.838
task460137d1-7daf-419b-b0d5-87f31833176c start:2016-09-07 00:49:15.838
task460137d1-7daf-419b-b0d5-87f31833176c end:2016-09-07 00:49:17.838
taskce78bffb-8151-46e8-81d9-57b01e9294a2 start:2016-09-07 00:49:17.838
taskce78bffb-8151-46e8-81d9-57b01e9294a2 end:2016-09-07 00:49:19.838
task1fad4b4f-4143-4098-943a-c894ad96ae58 start:2016-09-07 00:49:19.838
task1fad4b4f-4143-4098-943a-c894ad96ae58 end:2016-09-07 00:49:21.838
taskc5de2fab-0688-4410-9408-b0990cc76223 start:2016-09-07 00:49:21.838
taskc5de2fab-0688-4410-9408-b0990cc76223 end:2016-09-07 00:49:23.838
task7dccb95b-6088-4a5d-a2e0-edb4381f7d0c start:2016-09-07 00:49:23.838
task7dccb95b-6088-4a5d-a2e0-edb4381f7d0c end:2016-09-07 00:49:25.838
taskc05908b5-1bb2-496a-9ddc-c3939d783f2c start:2016-09-07 00:49:25.838
taskc05908b5-1bb2-496a-9ddc-c3939d783f2c end:2016-09-07 00:49:27.839
task251c4102-f214-4eb9-9e13-7ca7f2eb3362 start:2016-09-07 00:49:27.839
task251c4102-f214-4eb9-9e13-7ca7f2eb3362 end:2016-09-07 00:49:29.839
task645f6f0f-9d11-4545-be12-1feab67a6b06 start:2016-09-07 00:49:29.839
task645f6f0f-9d11-4545-be12-1feab67a6b06 end:2016-09-07 00:49:31.84
task82da54a5-6620-46f4-a840-10633555d2e8 start:2016-09-07 00:49:31.84
task82da54a5-6620-46f4-a840-10633555d2e8 end:2016-09-07 00:49:33.84
taskb33558c1-cb84-4724-85af-ac8060b169a0 start:2016-09-07 00:49:33.84

转载于:https://www.cnblogs.com/yy3b2007com/p/5847779.html

使用ScheduledExecutorService实现Timer相关推荐

  1. 通过ScheduledExecutorService代替Timer

    用于记录一下 原来的代码是这样的: //定时器 Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic ...

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

    ScheduledExecutorService 前言   在Java中我们一般使用Timer来进行延时/周期执行操作,Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间 ...

  3. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

  4. class转java_[拒绝套路,纯干货]这一百多道 Java 基础问题你掌握了吗?

    码农每日一题长按关注,工作日分享一些技术知识点. [每日一题]Java 基本数据类型基础面试题 [每日一题]Java 包装类型装箱拆箱基础面试题 [每日一题]Java 字符串(Part 1)相关面试题 ...

  5. boot定时任务开启和关闭 spring_SpringBoot中的定时任务的同步与异步你确定真的知道?...

    定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过期的数据,定时发送邮件等等,实现定时任务调度的方式也十分多样,本篇文章主要学习各种实现定时任务调度方式的优缺点,以便为日后选择 ...

  6. 基于redis的分布式任务管理

    业务背景 系统中有各种定时任务,需要满足以下要求: 定时任务需要能够动态增删改查 需要能够设置任务的有效时间范围(只在此范围内执行) 任务执行周期需要能够灵活配置 需要能够轻松接入各种任务实现 需要能 ...

  7. Java ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() {@Overridepublic void run() {// ...

  8. 面试题:四种Java线程池用法解析 !=!=未看

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 2 3 4 5 6 7 8 new Thread(new Runnable() {   @Override   ...

  9. 阿里Java开发规约(2)

    本文是对阿里插件中规约的详细解释二,关于插件使用,请参考这里 及时清理不再使用的代码段或配置信息. 说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余 Positive examp ...

  10. Spring Job?Quartz?XXL-Job?年轻人才做选择,艿艿全莽~

    本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-28 目录. 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在产 ...

最新文章

  1. solarized for securecrt
  2. ftp服务器压缩文件,ftp压缩服务器文件
  3. x-code 4.61 无证书真机调试
  4. Java方法 signature
  5. C# 值类型的局限性
  6. 输入问题C++字符数组越界问题的一个案例分析
  7. 一个资源管理系统的设计--基于cgroup机制
  8. Linux虚拟文件系统之文件读取(sys_read())
  9. 深度图像配准_【阅读笔记】深度学习在医学图像分析领域的综述
  10. three.js教程和手册
  11. 【2020 ACM Fellow 华人学者】 Wei Wang 加州大学洛杉矶分校
  12. mysql超卖问题处理_mysql 解决超卖问题的锁分析
  13. 无人船水下地形测量的应用及优势
  14. typescript学习记录-练习项目-贪食蛇
  15. zephir-类和对象2
  16. hp服务器重装系统按什么键,惠普重装系统按什么键|惠普u盘装系统按哪个键
  17. 基于K-means算法的客户分群知识
  18. 搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验” 法院开审搜狗浏览器插件屏蔽优酷视频广告案...
  19. 两款扫雷游戏3D版源码
  20. Chemdraw 打开分子后在手性中心边上出现abs标签,怎么去除?

热门文章

  1. LINUX SHELL参数连接
  2. LINUX SHELL中,如何查找某些文件并删除
  3. 管理感悟:代码缺的不是注释,而是自解释
  4. VS中,DEBUG/RELEASE的宏定义不同引起的问题
  5. apache评分表的意义_APACHE-II评分表
  6. python从网页提取文本_从网页中提取文本
  7. sci的figure怎么做_一文看懂SCI论文中都有哪几种Figure
  8. go语言查询某个值是否在数组中_一日一技:在 Golang 中如何快速判断字符串是否在一个数组中...
  9. OMG: daily scrum nine
  10. 这种反人类的工作被机器人取代,我举双手双脚赞成