定时器在实际的开发中会非常的有用,比如在游戏的开发时间的控制上。也比如在每天的某一个时间点收邮件。定时器的操作主要是对以下两个类操作。

Timer

TimerTask

new Timer().schedule(task,time);从参数可以看出Timer调度是指在什么时间time,做什么事task

举下面的例子:比如现在有一个连环炸,10秒后炸(bombing!)一次,以后每隔3秒炸一次,实现的代码如下:

  • 代码1-1 10秒后炸(bombing!)一次,以后每隔3秒炸一次
 
  
  1. import java.util.Timer; 
  2. import java.util.TimerTask; 
  3.  
  4. public class TraditionalTimerTest { 
  5.     public static void main(String[] args) { 
  6.     new Timer().schedule(new TimerTask() { 
  7.             @Override 
  8.             public void run() { 
  9.                 System.out.println("bombing!"); 
  10.             } 
  11.         }, 10000,3000);//10秒以后开始bombing(炸);第一次是10后炸,以后每隔3秒炸 
  12.   } 

程序每隔3秒会打印一次bombing!,运行的部分截图如下:

那么这个逻辑该如何该如何实现:先2秒炸一下,再4秒炸一下,又是2秒炸一下,接着又是4秒炸一下,以此类推,不断的循环,每次间隔的时间不一样,交替出现。代码如下:

  • 1-2  每隔2秒和4秒打印一次bombing!
 
  
  1. import java.util.Date; 
  2. import java.util.Timer; 
  3. import java.util.TimerTask; 
  4.  
  5. public class TraditionalTimerTest { 
  6.     static int count=0;//内部类不能声明静态变量,应该放到外面 
  7.     public static void main(String[] args) { 
  8.   class myTimerTask extends TimerTask{//内部类里边不能生成静态变量 
  9.             //int x=0;//每次都是new的新对象,不能记住上次的值,不是全局的 
  10.             @Override 
  11.             public void run() { 
  12.                 count=(count+1)%2;//实现2秒和4秒的循环炸(奇数2秒,偶数4秒) 
  13.                 System.out.println("bombing!"); 
  14.                 new Timer().schedule(/*new TimerTask() { 
  15.                     @Override 
  16.                     public void run() { 
  17.                         System.out.println("bombing!"); 
  18.                     } 
  19.                 }*/new myTimerTask(),2000+2000*count); 
  20.                 //设计一个类,拿这个类去new很多的对象 
  21.             } 
  22.         } 
  23.          
  24.         new Timer().schedule(new myTimerTask(),2000);//2秒以后开始炸 
  25.         while(true){ 
  26.             System.out.println(new Date().getSeconds());//打印当前是多少秒 
  27.             try { 
  28.                 Thread.sleep(1000); 
  29.             } catch (InterruptedException e) { 
  30.                 e.printStackTrace(); 
  31.             } 
  32.         } 
  33.     } 

运行的部分截图:

注:开源工具:quartz实现每隔一定的时间操作。