大家都说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();
//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(), ,, 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{
@Override
public 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

使用ScheduledExecutorService实现Timer的更多相关文章

  1. ScheduledExecutorService和timer的异同

    先来个传统的Timer的例子: package com.jerry.concurrency; import java.text.ParseException; import java.text.Sim ...

  2. 任务调度(四)——ScheduledExecutorService替代Timer,实现多线程任务调度

    上篇博文<任务调度(三)--Timer的替代品ScheduledExecutorService简介>已经对ScheduledExecutorService做了简介.事实上使用Schedul ...

  3. java定时任务Timer与ScheduledExecutorService<转>

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. ...

  4. 详解java定时任务---Timer篇

    一.简介      在java的jdk中提供了Timer.TimerTask两个类来做定时任务. Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子 ...

  5. 线程 Timer TimerTask 计时器 定时任务 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. 详解java定时任务

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析JavaTimer定时器. ...

  7. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  8. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  9. Java(Android)线程池

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

随机推荐

  1. 百度mobile UI组件GMU demo学习1-结构和初始化

    移动web现在已经是zepto的天下,但是一直找不到合适UI库,找了一段时间,终于找到了百度的ui库gum和inter 的 appframework UI库 相比之下,百度的UI库更接地气,配合百度强 ...

  2. PHP程序员 新人求职 平台

    投简历网站:大街网:中下,但是反馈速度不错拉勾网:中上,工资好像很多都很不错实习僧:不太熟悉,中等吧猎聘网:好像不错,本人不常用海投网:不清楚,没用过以上评级都是个人感觉而已,不代表正式评价个人感觉以 ...

  3. 关于Repeater嵌套绑定的问题

    前台代码: <div id="firstpane" class="menu_list">                <asp:Repeat ...

  4. 【Go语言】I/O专题

    本文目录 1.bytes包:字节切片.Buffer和Reader 1_1.字节切片处理函数 1_1_1.基本处理函数 1_1_2.字节切片比较函数 1_1_3.字节切片前后缀检查函数 1_1_4.字节 ...

  5. java 反取字符串

    public class demo2 { /** * 2 : 将字符串反取出来 新中国好 好国中新 */ public static void main(String[] args) { String ...

  6. POJ3468 线段树(区间更新,区间求和,延迟标记)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 97196   ...

  7. 关于viewpoint的疑惑

    问题: 为什么在手机上打开一个PC web页面,用手机打开一个宽度为980的固定布局页面,页面会默认缩放到刚好满屏显示,并不会出现横向滚动条? 一:设备像素和CSS像素区别 现代浏览器中实现缩放的方式 ...

  8. 在cenOS下安装apache出现-bash: /etc/init.d/httpd: 没有那个文件或目录

    我是在vmware上装的centos7,使用命令yum install httpd httpd-devel 安装完apache后,想要启动apache,执行了/etc/init.d/httpd sta ...

  9. SQL,LINQ,Lambda语法对照图(转载)

    如果你熟悉SQL语句,当使用LINQ时,会有似曾相识的感觉.但又略有不同.下面是SQL和LINQ,Lambda语法对照图 SQL LINQ Lambda SELECT * FROM HumanReso ...

  10. 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

    1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...