文档章节

timer

会飞的蝌蚪
 会飞的蝌蚪
发布于 2015/04/24 20:23
字数 642
阅读 14
收藏 0

  在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等。在本文里,我会给大家介绍3种不同的实现方法:

  • 普通thread实现

  • TimerTask实现

  • ScheduledExecutorService实现

普通thread

这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  class  Task1 {
public  static  void  main(String[] args) {
   // run in a second
   final  long  timeInterval =  1000 ;
   Runnable runnable =  new  Runnable() {
   public  void  run() {
     while  ( true ) {
       // ------- code for task to run
       System.out.println( "Hello !!" );
       // ------- ends here
       try  {
        Thread.sleep(timeInterval);
       catch  (InterruptedException e) {
         e.printStackTrace();
       }
       }
     }
   };
   Thread thread =  new  Thread(runnable);
   thread.start();
   }
}

 

用Timer和TimerTask

上面的实现是非常快速简便的,但它也缺少一些功能。
用Timer和TimerTask的话与上述方法相比有如下好处:

  • 当启动和去取消任务时可以控制

  • 第一次执行任务时可以指定你想要的delay时间

在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。
Timer实例可以调度多任务,它是线程安全的。
当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import  java.util.Timer;
import  java.util.TimerTask;
public  class  Task2 {
   public  static  void  main(String[] args) {
     TimerTask task =  new  TimerTask() {
       @Override
       public  void  run() {
         // task to run goes here
         System.out.println( "Hello !!!" );
       }
     };
     Timer timer =  new  Timer();
     long  delay =  0 ;
     long  intevalPeriod =  1  1000 ;
     // schedules the task to be run in an interval
     timer.scheduleAtFixedRate(task, delay,
                                 intevalPeriod);
   // end of main
}

 

ScheduledExecutorService

ScheduledExecutorService是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。
相比于上两个方法,它有以下好处:

  •  相比于Timer的单线程,它是通过线程池的方式来执行任务的

  •  可以很灵活的去设定第一次执行任务delay时间

  •  提供了良好的约定,以便设定执行的时间间隔

 我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import  java.util.concurrent.Executors;
import  java.util.concurrent.ScheduledExecutorService;
import  java.util.concurrent.TimeUnit;
public  class  Task3 {
   public  static  void  main(String[] args) {
     Runnable runnable =  new  Runnable() {
       public  void  run() {
         // task to run goes here
         System.out.println( "Hello !!" );
       }
     };
     ScheduledExecutorService service = Executors
                     .newSingleThreadScheduledExecutor();
     service.scheduleAtFixedRate(runnable,  0 1 , TimeUnit.SECONDS);
   }
}

 

 


© 著作权归作者所有

共有 人打赏支持
上一篇: struts2下载功能
下一篇: 建造者模式
会飞的蝌蚪
粉丝 12
博文 80
码字总数 28126
作品 0
昌平
后端工程师
私信 提问
SCTP 库的简述和代码 (4)

2 定时器 简单的时间轮. 使用时间轮是因为, 定时器数目可能比较大. 要求使用者周期性调用, ptimerwheel_hb 缺点是, 不精确. / Hash table for hold timer list / static listheader wheelslo...

jundai
2011/04/09
0
0
del_timer_sync不能睡眠的原因

这个函数不能在中断中被调用的原因就是防止删除timer的时候忙等,怎么忙等呢?在trytodeltimersync出现之前,如果中断打断了正在执行的timer,那么中断中执行deltimersync的时候就会永远忙等...

晨曦之光
2012/04/10
369
0
Timer/TimerTask 学习

今天看到在server有用到Timer来不断的更新数据的转台,然后通过消息方式通知前端,感觉还是挺有用处的。 import java.util.Timer;import java.util.TimerTask; public class TimerTest { @O...

pczhangtl
2014/01/15
0
0
高精度定时器的使用

tbox内部提供了两种定时器实现:timer和ltimer timer: 高精度版本,采用最小堆实现,复杂度是:O(log(n)) ltimer: 低精度版本,采用linux内核中的timing-wheel算法,复杂度是:O(1) 这里主要...

ruki
2015/12/21
55
0
Linux内核中关于定时器Timer的应用

在Touchscreen驱动中 1 声明 Ad7877.c (linux-2.6.30.4driversinputtouchscreen): struct timer_list timer; /* P: lock */ 2 初始化 在函数 static int devinit ad7877probe(struct spidev......

tsuibin
2012/08/02
0
1

没有更多内容

加载失败,请刷新页面

加载更多

babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
37分钟前
1
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0
深入理解Plasma(四):Plasma Cash

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章主要介绍在 Plasma 框架下的项目 Plasma Cash。 深入理解Plasma(1):...

HiBlock
昨天
1
0
命令参数的三大风格:Posix、BSD、GNU

今天读到命令行中参数的风格有三大类,即Unix/Posix、BSD、GNU。分别有以下特征: Unix/Posix风格,即命令后的参数,可以分组,便必须以连字符开头,如ps -aux。 BSD风格,即命令后的参数,可...

大别阿郎
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部