> 文档中心 > java中的定时器

java中的定时器

Timer 和 Timer Task 的使用

Timer 是一种定时器工具,用来在一个后台线程计划执行指定任务,这些任务可以被执行一次,也可以被定期执行。每个 Timer 对象对应一个后台线程,顺序地执行所有计时器任务。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程,从而可能延迟后续任务的执行。对 Timer 对象最后的引用完成并且所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。TimerTask是一个抽象类,实现了Runable接口,它的子类代表一个可以被Timer计划的任务。

1) 一个简单的Demo,让大家对Timer、TimerTask的使用有感性的认识。

 

2) Timer和TimerTask的常用api函数说明

 

这里强调Timer类的schedule和scheduleAtFixedRate的区别。schedule和scheduleAtFixedRate的区别在于,schedule以固定的相对时间间隔执行,如果某一次执行被延时了,往后的执行的执行时间也会相对延时;而scheduleAtFixedRate是以绝对的时间间隔执行,如果某一次执行被延时,它的后一次执行的延时将会缩短(scheduleAtFixedRate会把已经过去的时间也作为周期执行)。schedule注重的是时间间隔的稳定,而scheduleAtFixedRate注重的是执行频率的稳定。

3) Timer的终止

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:

a)调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;

b)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;

c)当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止;

d)调用System.exit方法,使整个程序(所有线程)终止。

总结:Timer和TimerTask可以简单理解为Timer定时器在触发TimerTask任务调用,通常用schedule和scheduleAtFixedRate方法来调用timertask任务,cancle来终止任务调用。Timer简单易用,比较适合提供轻量级的计时器功能,但是对时效性很强的任务调度请用其它方法来实现(正如javadoc所述”Timer does not offer real-time guarantees: it schedules tasks using the Object.wait(long) method”)。

 

Demo程序: 每隔3秒打印一个文件的内容.

 

package com.timer.test;

import java.util.*;
import java.io.*;

public class timer_test
{
 public static void main(String[] args)
 {
  PickTask pt = new PickTask();
  pt.start(1,3);
 }
}

class PickTask
{
 private Timer timer;

 public PickTask()
 {
  timer = new Timer();
 }
 
 private TimerTask task = new TimerTask()
 {
  public void run()
  {
  
   try
   {
    BufferedReader br = new BufferedReader(new FileReader("D://test_file.txt"));
    String data = null;
    while((data=br.readLine())!=null)
    {
     System.out.println(data);
    }
   }
   catch(FileNotFoundException e)
   {
    System.out.println("can not find the file");
   }
   catch(IOException e)
   {
    e.printStackTrace();
   }
  
  }
 };
 
 public void start(int delay,int internal )
 {
  timer.schedule(task,delay*1000,internal*1000);
 }
 
}

/* test_file.txt的内容:
Ada
Basic
C/C++
D
FORTUNE
Go
Java

*/

/* 运行结果://每隔3秒打印出文件的内容。
Ada
Basic
C/C++
D
FORTUNE
Go
Java

Ada
Basic
C/C++
D
FORTUNE
Go
Java

Ada
Basic
C/C++
D
FORTUNE
Go
Java

*/

 

闲鱼礼物网