Timer和TimeTask简介

Timer和TimeTask简介


Timer是一种线程设施,用于安排之后在后台线程中执行的任务。可安排任务执行一次,或者按期重复执行,能够当作一个定时器,能够调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,因此具有了多线程的能力。 java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java . util . TimerTask ;
public class MyTask extends TimerTask
{
private int id ;
public MyTask ( int id )
{
this . id = id ;
}
public void run ( )
{
System . out . println ( "线程" + id + ":正在执行" ) ;
//System.gc();
}
}

而后主程序代码为: 多线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java . util . Date ;
import java . util . Timer ;
public class Test
{
public static void main ( String [ ] args )
{
Timer timer = new Timer ( ) ;
timer . schedule ( new MyTask ( 1 ) , 5000 ) ; // 5秒后启动任务
MyTask secondTask = new MyTask ( 2 ) ;
timer . schedule ( secondTask , 1000 , 3000 ) ;
// 1秒后启动任务,之后每隔3秒执行一次线程
Date date = new Date ( ) ;
timer . schedule ( new MyTask ( 3 ) , new Date ( date . getTime ( ) + 1000 ) ) ;
//      以date为参数,指定某个时间点执行线程
//      timer.cancel();
//      secondTask.cancel();
System . out . println ( "main thread 结束!" ) ;
}
}

Timer里面有4个schedule重载函数,并且还有两个scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
使用scheduleAtFixedRate的话,Timer会尽可能的让任务在一个固定的频率下运行。例如:在上面的例子中,让secondTask在1秒钟后,每3秒钟执行一次,可是由于java不是实时的,因此,咱们在上个程序中表达的原义并不可以严格执行,例若有时可能资源调度紧张4秒之后才执行下一次,有时候又3.5秒执行。若是咱们调用的是scheduleAtFixedRate,那么Timer会尽可能让你的secondTask执行的频率保持在3秒一次。运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,secondTask执行一次,由于系统繁忙,以后的3.5秒后secondTask才得以执行第二次,而后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。
Timer终止的问题:
默认状况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。能够经过如下3种方法终止一个timer线程:
(1)调用timer的cancle方法。你能够从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
(2)让timer线程成为一个daemon线程(能够在建立timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;
(3)调用System.exit方法,使整个程序(全部线程)终止。
TimerTask也有cancel方法。
上面所说的“只要一个程序的timer线程在运行,那么这个程序就会保持运行”。那么反过来,若是Timer里的全部TimerTask都执行完了,整个程序会退出吗,经测试是否认的,例如上面的测试代码,若是只加第一个TimerTask在Timer中执行:
timer.schedule(new MyTask(1), 5000);// 5秒后启动任务
那么5秒之后,其实整个程序仍是没有退出,Timer会等待垃圾回收的时候被回收掉而后程序会得以退出,可是多长时间呢?在TimerTask的run函数执行完之后加上System.gc();就能够了。 ide

Java定时调度 Timer类和TimerTask类


 

  Timer类是一种线程设施,能够用来实现某一个时间或某一段时间后安排某一个任务执行一次或按期重复执行。该功能和TimerTask配合使用。TimerTask类用于实现由Timer安排的一次或重复执行的某个任务。每个Timer对象对应的是一个线程,所以计时器所执行的任务应该迅速完成,不然会延迟后续的任务执行。 
  Timer类方法摘要 
函数

Java代码   收藏代码
  1. void cancel()   
  2.           终止此计时器,丢弃全部当前已安排的任务。   
  3.  int purge()   
  4.           今后计时器的任务队列中移除全部已取消的任务。   
  5.  void schedule(TimerTask task, Date time)   
  6.           安排在指定的时间执行指定的任务。   
  7.  void schedule(TimerTask task, Date firstTime, long period)   
  8.           安排指定的任务在指定的时间开始进行重复的固定延迟执行。   
  9.  void schedule(TimerTask task, long delay)   
  10.           安排在指定延迟后执行指定的任务。   
  11.  void schedule(TimerTask task, long delay, long period)   
  12.           安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。   
  13.  void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)   
  14.           安排指定的任务在指定的时间开始进行重复的固定速率执行。   
  15.  void scheduleAtFixedRate(TimerTask task, long delay, long period)   
  16.           安排指定的任务在指定的延迟后开始进行重复的固定速率执行。   


TimerTask类方法摘要 
Java代码  
  1. boolean cancel()   
  2.           取消此计时器任务。   
  3. abstract  void run()   
  4.           此计时器任务要执行的操做。   
  5.  long scheduledExecutionTime()   
  6.           返回此任务最近实际 执行的已安排 执行时间。   


TimerTask类是个抽象类,若是要用该类,须要本身创建一个类来继承此类,并实现其中的抽象方法。 

Java代码  收藏代码package zzs.time.demo;   测试



  1.   
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Date;  
  4. import java.util.TimerTask;  
  5.   
  6. public class MyTask extends TimerTask {  
  7.   
  8.     @Override  
  9.     public void run() {  
  10.         // TODO Auto-generated method stub  
  11.         SimpleDateFormat simpleDateFormat=null;  
  12.         simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");  
  13.         System.out.println("当前的系统时间为:"+simpleDateFormat.format(new Date()));  
  14.   
  15.     }  
  16.   
  17. }  



Java代码   收藏代码
  1. package zzs.time.demo;  
  2.   
  3. import java.util.Timer;  
  4.   
  5. public class TestTask {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      * @throws InterruptedException  
  10.      */  
  11.     public static void main(String[] args) throws InterruptedException {  
  12.         // TODO Auto-generated method stub  
  13.         Timer  timer=new Timer();  
  14.         MyTask myTask=new MyTask();  
  15.         timer.schedule(myTask, 10002000);  
  16.                // Thread.sleep(5000);  
  17.         //timer.cancel();  
  18.   
  19.     }  
  20. }  


运行结果: 
Java代码   收藏代码
  1. 当前的系统时间为:2011-07-10 15:37:44:831  
  2. 当前的系统时间为:2011-07-10 15:37:46:786  
  3. 当前的系统时间为:2011-07-10 15:37:48:786  
  4. 当前的系统时间为:2011-07-10 15:37:50:786  
  5. 当前的系统时间为:2011-07-10 15:37:52:786  
  6. 当前的系统时间为:2011-07-10 15:37:54:786  

相关文章
相关标签/搜索