Timer 和 ScheduledExecutorSeruvce 都能执行定时的循环任务,有函数 scheduleAtFixedRate。但是,如果任务运行时间较长,超过了一个周期时长,下一个任务就会被延缓执行。
例如代码:
1 public class ScheduledRunnableTest extends TimerTask { 2 public void run() { 3 try { 4 Thread.sleep(2000); 5 System.out.println(new Timestamp(System.currentTimeMillis()).toString()); 6 } catch (InterruptedException e) { 7 e.printStackTrace(); 8 } 9 } 10 11 public static void main(String[] args) { 12 Timer timer = new Timer(); 13 timer.scheduleAtFixedRate(new ScheduledRunnableTest(), 0, 1000); 14 } 15 }
运行结果为:
2014-07-31 13:12:30.002
2014-07-31 13:12:32.006
2014-07-31 13:12:34.006
2014-07-31 13:12:36.008
并不是希望的每秒运行一次。所以得重开线程执行,代码如下:
1 public class ScehduledThreadTest extends Thread{ 2 public void run() { 3 try { 4 Thread.sleep(2000); 5 System.out.println(new Timestamp(System.currentTimeMillis()).toString()); 6 } catch (InterruptedException e) { 7 e.printStackTrace(); 8 } 9 } 10 11 public static void main(String[] args) { 12 Timer timer = new Timer(); 13 timer.scheduleAtFixedRate(new TimerTask() { 14 public void run() { 15 new ScehduledThreadTest().start(); 16 } 17 }, 18 0, 1000); 19 } 20 }
这样的结果就是:
2014-07-31 13:15:10.652
2014-07-31 13:15:11.652
2014-07-31 13:15:12.652