Java Timer和TimerTask实例教程

Java Timer和TimerTask实例教程 



本文由 ImportNew - liken 翻译自 journaldev。欢迎加入Java小组。转载请参见文章末尾的要求。

java.util.Timer是一个实用工具类,该类用来调度一个线程,使它可以在将来某一时刻执行。 Java的Timer类可以调度一个任务运行一次,或定期运行。

java.util.TimerTask是一个抽象类,它实现了Runnable接口。我们需要扩展该类以便创建自己的TimerTask,这个TimerTask内部使用java Timer类,可以被调度。

Timer类是线程安全的,多进程不需要外部同步机制就可以共享同一个Timer对象。Timer类使用java.util.TaskQueue在指定时间间隔添加任务,在任何时刻只能有一个线程执行TimerTask。例如,创建一个每10秒运行的Timer,但单个线程的执行时间花费20秒,Timer对象将持续将任务添加到队列,一旦有任务结束,它就会通知队列,并且另外一个线程将启动执行。

Timer类使用对象的wait和notify方法来调度任务。

如下是一个使用Timer和TimerTask的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.journaldev.threads;
 
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
public class MyTimerTask extends TimerTask {
 
     @Override
     public void run() {
         System.out.println( "Timer task started at:" + new Date());
         completeTask();
         System.out.println( "Timer task finished at:" + new Date());
     }
 
     private void completeTask() {
         try {
             //assuming it takes 20 secs to complete the task
             Thread.sleep( 20000 );
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
 
     public static void main(String args[]){
         TimerTask timerTask = new MyTimerTask();
         //running timer task as daemon thread
         Timer timer = new Timer( true );
         timer.scheduleAtFixedRate(timerTask, 0 , 10 * 1000 );
         System.out.println( "TimerTask started" );
         //cancel after sometime
         try {
             Thread.sleep( 120000 );
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         timer.cancel();
         System.out.println( "TimerTask cancelled" );
         try {
             Thread.sleep( 30000 );
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
 
}

注意,一个线程执行花费20秒,但Timer对象每10秒就调度一次任务。如下是程序的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TimerTask started
Timer task started at:Mon Mar 03 12:58:24 CST 2014
Timer task finished at:Mon Mar 03 12:58:44 CST 2014
Timer task started at:Mon Mar 03 12:58:44 CST 2014
Timer task finished at:Mon Mar 03 12:59:04 CST 2014
Timer task started at:Mon Mar 03 12:59:04 CST 2014
Timer task finished at:Mon Mar 03 12:59:24 CST 2014
Timer task started at:Mon Mar 03 12:59:24 CST 2014
Timer task finished at:Mon Mar 03 12:59:44 CST 2014
Timer task started at:Mon Mar 03 12:59:44 CST 2014
Timer task finished at:Mon Mar 03 13:00:04 CST 2014
Timer task started at:Mon Mar 03 13:00:04 CST 2014
TimerTask cancelled
Timer task finished at:Mon Mar 03 13:00:24 CST 2014

输出结果证实,如果一个任务已经执行,Timer将等待它执行结束,一旦任务执行结束,Timer对象将再次启动队列中的下一个任务。

Timer对象可作为一个守护线程运行相关的任务。Timer的cancel()方法用于终止计时器,并丢弃待调度的任务。然而,Timer不会干扰当前执行的任务,并且让它执行结束。如果计时器用于执行守护线程,无论是否取消它,它都会等待所有用户线程结束后终止。

Timer类包含一些sechedule()方法用于调度一个任务在指定时间运行一次或者延时之后运行。还有一些scheduleAtFixedRate()方法用于在一定间隔后周期运行任务

当使用Timer调度任务时,必须确保时间间隔超过正常程序运行时间,否则任务队列的大小将持续增长,最终程序将无法停止。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值