文档章节

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下载功能
下一篇: 建造者模式
会飞的蝌蚪
粉丝 13
博文 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的时候忙等,怎么忙等呢?在try_to_del_timer_sync出现之前,如果中断打断了正在执行的timer,那么中断中执行del_timer_sync的时候就会永...

晨曦之光
2012/04/10
395
0
linux中断的不确定性带来的问题

如果说一个函数不能在中断中调用,那么很多人都会想到那个函数可能会睡眠,而中断中不能睡眠。可是仅仅是因为不能睡眠吗?实际上因为中断是完全不确定的,所以它带来的限制不仅仅只是不能睡眠...

晨曦之光
2012/04/10
183
0
随想:看了Posix的timer后而发的一些感慨

昨天研究了linux的用户timer,其实不是linux的用户timer而是posix规定的一个timer接口,这个接口规定了一些规 则,linux具体在内核或用户空间来实现而不一定非要在内核空间实现,posix标准只...

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

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

pczhangtl
2014/01/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

更换本地git仓库的远程地址

参考学习链接:https://blog.csdn.net/mlq8087/article/details/81360025 本地 Git 仓库根目录下:cd .git ; 编辑 Git 配置文件:vim config ; shift + i 进入input 编辑模式 ; 修改 [rem...

Liens
6分钟前
0
0
Install hadoop, install hive, 及hive的使用

hadoop , hive 安装过程和配置文件(附件)。 注意: hadoop Name Node未做ha. Hive, 还是基本的hive on MR, 未使用on tez, on spark, 未配置LLAP、 HCatalog and WebHCat。 安装完之后,以...

墨子Zhai
6分钟前
0
0
如何处理缓存失效、缓存穿透、缓存并发等问题

缓存失效:   引起这个原因的主要因素是高并发下,我们一般设定一个缓存的过期时间时,可能有一些会设置5分钟啊,10分钟这些;并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过...

我心中有猛狗
9分钟前
1
0
对于java 参数是值传递还是引用传递的

代码: package com.qimh.anotation;public class Test { static class Person{ private String name; public String getName() { return name;......

qimh
16分钟前
0
0
Pages Manager——可本地管理Pages服务内容,一键生成漂亮的文档界面。

Pages Manager Git地址 可本地管理Pages服务内容,一键生成漂亮的文档界面。在线预览 简单、轻便,无需安装数据库。 框架:spring-boot 数据库:sqlite 原理 本地维护一组markdown文档 将mar...

tanghc
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部