使用ScheduledExecutorService实现Timer
大家都说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相关推荐
- 通过ScheduledExecutorService代替Timer
用于记录一下 原来的代码是这样的: //定时器 Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic ...
- 线程池延时类ScheduledExecutorService—比Timer更有效精确的延时工具
ScheduledExecutorService 前言 在Java中我们一般使用Timer来进行延时/周期执行操作,Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间 ...
- 四种Java线程池用法解析
四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...
- class转java_[拒绝套路,纯干货]这一百多道 Java 基础问题你掌握了吗?
码农每日一题长按关注,工作日分享一些技术知识点. [每日一题]Java 基本数据类型基础面试题 [每日一题]Java 包装类型装箱拆箱基础面试题 [每日一题]Java 字符串(Part 1)相关面试题 ...
- boot定时任务开启和关闭 spring_SpringBoot中的定时任务的同步与异步你确定真的知道?...
定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过期的数据,定时发送邮件等等,实现定时任务调度的方式也十分多样,本篇文章主要学习各种实现定时任务调度方式的优缺点,以便为日后选择 ...
- 基于redis的分布式任务管理
业务背景 系统中有各种定时任务,需要满足以下要求: 定时任务需要能够动态增删改查 需要能够设置任务的有效时间范围(只在此范围内执行) 任务执行周期需要能够灵活配置 需要能够轻松接入各种任务实现 需要能 ...
- Java ExecutorService四种线程池的例子与说明
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() {@Overridepublic void run() {// ...
- 面试题:四种Java线程池用法解析 !=!=未看
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 2 3 4 5 6 7 8 new Thread(new Runnable() { @Override ...
- 阿里Java开发规约(2)
本文是对阿里插件中规约的详细解释二,关于插件使用,请参考这里 及时清理不再使用的代码段或配置信息. 说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余 Positive examp ...
- Spring Job?Quartz?XXL-Job?年轻人才做选择,艿艿全莽~
本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-28 目录. 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在产 ...
最新文章
- solarized for securecrt
- ftp服务器压缩文件,ftp压缩服务器文件
- x-code 4.61 无证书真机调试
- Java方法 signature
- C# 值类型的局限性
- 输入问题C++字符数组越界问题的一个案例分析
- 一个资源管理系统的设计--基于cgroup机制
- Linux虚拟文件系统之文件读取(sys_read())
- 深度图像配准_【阅读笔记】深度学习在医学图像分析领域的综述
- three.js教程和手册
- 【2020 ACM Fellow 华人学者】 Wei Wang 加州大学洛杉矶分校
- mysql超卖问题处理_mysql 解决超卖问题的锁分析
- 无人船水下地形测量的应用及优势
- typescript学习记录-练习项目-贪食蛇
- zephir-类和对象2
- hp服务器重装系统按什么键,惠普重装系统按什么键|惠普u盘装系统按哪个键
- 基于K-means算法的客户分群知识
- 搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验” 法院开审搜狗浏览器插件屏蔽优酷视频广告案...
- 两款扫雷游戏3D版源码
- Chemdraw 打开分子后在手性中心边上出现abs标签,怎么去除?
热门文章
- LINUX SHELL参数连接
- LINUX SHELL中,如何查找某些文件并删除
- 管理感悟:代码缺的不是注释,而是自解释
- VS中,DEBUG/RELEASE的宏定义不同引起的问题
- apache评分表的意义_APACHE-II评分表
- python从网页提取文本_从网页中提取文本
- sci的figure怎么做_一文看懂SCI论文中都有哪几种Figure
- go语言查询某个值是否在数组中_一日一技:在 Golang 中如何快速判断字符串是否在一个数组中...
- OMG: daily scrum nine
- 这种反人类的工作被机器人取代,我举双手双脚赞成