Java线程(五):Timer和TimerTask

来源:互联网 发布:数据库的应用场景 编辑:程序博客网 时间:2024/04/27 16:21

        Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。

        Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

        一个Timer可以调度任意多个TimerTask,它会将TimerTask存储在一个队列中,顺序调度,如果想两个TimerTask并发执行,则需要创建两个Timer。下面来看一个简单的例子:       

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. import java.util.Timer; 
  2. import java.util.TimerTask; 
  3. public class TimerTest { 
  4.     static class MyTimerTask1extends TimerTask { 
  5.         public void run() { 
  6.             System.out.println("爆炸!!!"); 
  7.         } 
  8.     }    
  9.     public staticvoid main(String[] args) { 
  10.         Timer timer = new Timer(); 
  11.         timer.schedule(new MyTimerTask1(),2000);// 两秒后启动任务 
  12.     } 
        schedule是Timer调度任务的方法,Timer重构了四个schedule方法,具体可以查看JDK API。

        看一个稍复杂的例子,假设有这样一种需求,实现一个连环炸弹,2秒后爆炸一次,3秒后爆炸一次,如此循环下去,这就需要创建两个任务,互相调度,代码如下:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. import java.util.Date; 
  2. import java.util.Timer; 
  3. import java.util.TimerTask; 
  4. public class TimerTest { 
  5.     static class MyTimerTask1extends TimerTask { 
  6.         public void run() { 
  7.             System.out.println("爆炸!!!"); 
  8.             new Timer().schedule(new MyTimerTask2(),2000); 
  9.         } 
  10.     } 
  11.     static class MyTimerTask2extends TimerTask { 
  12.         public void run() { 
  13.             System.out.println("爆炸!!!"); 
  14.             new Timer().schedule(new MyTimerTask1(),3000); 
  15.         } 
  16.     } 
  17.     public staticvoid main(String[] args) { 
  18.         Timer timer = new Timer(); 
  19.         timer.schedule(new MyTimerTask2(),2000); 
  20.         while(true) { 
  21.             System.out.println(new Date().getSeconds()); 
  22.             try
  23.                 Thread.sleep(1000); 
  24.             } catch (InterruptedException e) { 
  25.                 // TODO Auto-generated catch block 
  26.                 e.printStackTrace(); 
  27.             } 
  28.         } 
  29.     } 

        自JDK5之后,可以用ScheduledThreadPoolExecutor来替代Timer。

        本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7436458,转载请注明。

0 0