文档章节

timer

会飞的蝌蚪
 会飞的蝌蚪
发布于 2015/04/24 20:23
字数 642
阅读 13
收藏 0
点赞 0
评论 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);
   }
}

 

 


© 著作权归作者所有

共有 人打赏支持
会飞的蝌蚪
粉丝 12
博文 79
码字总数 28120
作品 0
昌平
后端工程师
Timer/TimerTask 学习

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

pczhangtl
2014/01/15
0
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
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
高精度定时器的使用

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

ruki
2015/12/21
55
0
图片自动滚动器

PageControl 在storyboard的scrollView中添加后,在代码中给scrollView中添加图片,会将pageControl覆盖掉,看不到了。 添加计时器: [NSTimer scheduledTimerWithTimeInterval:2.0 target:s...

马尔代夫的沙滩
2016/04/30
58
0
C#中Timer组件用法

Timer组件是也是一个WinForm组件了,和其他的WinForm组件的最大区别是:Timer组件是不可见的,而其他大部分的组件都是都是可见的,可以设计的。Timer组件也被封装在名称空间System.Windows.Fo...

晨曦之光
2012/03/09
182
0
随想:看了Posix的timer后而发的一些感慨

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

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

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

晨曦之光
2012/04/10
180
0
Java多线程编程要点 (二)

4、 Timer 和 Timer Task 的使用 Timer 是一种定时器工具,用来在一个后台线程计划执行指定任务,这些任务可以被执行一次,也可以被定期执行。每个 Timer 对象对应一个后台线程,顺序地执行所...

曾赛
2010/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hbase增删查改工具类

package cn.hljmobile.tagcloud.service.data.repository;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util......

gulf
10分钟前
0
0
详解机器学习中的梯度消失、爆炸原因及其解决方法

前言 本文主要深入介绍深度学习中的梯度消失和梯度爆炸的问题以及解决方案。本文分为三部分,第一部分主要直观的介绍深度学习中为什么使用梯度更新,第二部分主要介绍深度学习中梯度消失及爆...

tantexian
11分钟前
0
0
JavaMail 发送邮件

参考 https://www.cnblogs.com/xdp-gacl/p/4216311.html 发送html格式邮件 package com.example.stumgr;import java.util.Properties;import javax.mail.Message;import javax.mail......

阿豪boy
12分钟前
0
0
Mongodb安装教程

MongoDB是一个基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bso...

木筏笔歆
13分钟前
0
0
Hadoop之YARN命令

概述 YARN命令是调用bin/yarn脚本文件,如果运行yarn脚本没有带任何参数,则会打印yarn所有命令的描述。 使用: yarn [--config confdir] COMMAND [--loglevel loglevel] [GENERIC_OPTIONS] [...

舒运
14分钟前
0
0
个推数据统计产品(个数)iOS集成实践

最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据。这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用统计”,根据官方的说法,个推的数...

个推
15分钟前
0
0
Git 修改提交的用户名和邮箱名字

在通过git提交代码时,发现提交的用户名是自己mac的账户名,想要修改为其他名字和邮箱。 首先可以通过以下命令查看当前配置下的信息,包括用户名和邮箱: > git config --list 针对单项目的相...

edwardGe
19分钟前
0
0
Object.defineProperty()

Object.defineProperty(obj, props)方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。 obj 在其上定义或修改属性的对象 props 要定义其可枚举属性或修改的属性描述符的对象 ...

litCabbage
20分钟前
0
0
JEESZ分布式框架--单点登录集成方案(三)

多项目集成单点登录配置 当sso验证完成之后,客户端系统需要接收sso系统返回的结果时,需要定义一个过滤器获取返回结果,然后针对返回结果做相关处理.如果不需要做处理时,此处Filter也可以不...

明理萝
20分钟前
0
1
超简单的利用plist 查看ipa包名及其它信息

1.下载ipa安装包 2.用rar等工具打开 3.将iTunesMetadata.plist文件解压出来 4.用http://www.atool.org/plist_reader.php在线反编译工具 5.在其中中找到softwareVersionBundleId 就是包名...

xiaogg
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部