1. 程式人生 > >java定時器 schedule和scheduleAtFixedRate區別

java定時器 schedule和scheduleAtFixedRate區別

schedule和scheduleAtFixedRate的區別在於,如果指定開始執行的時間在當前系統執行時間之前,scheduleAtFixedRate會把已經過去的時間也作為週期執行,而schedule不會把過去的時間算上。

比如

SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  Date d1 = fTime.parse("2005/12/30 14:10:00");
  
  t.scheduleAtFixedRate(new TimerTask(){
   public void run()
   {
       System.out.println("this is task you do6");
   }
  },d1,3*60*1000);

間隔時間是3分鐘,指定開始時間是2005/12/30 14:10:00,如果我在14:17:00分執行這個程式,那麼會立刻列印3次

this is task you do6     //14:10
this is task you do6     //14:13
this is task you do6     //14:16

並且注意,下一次執行是在14:19 而不是 14:20。就是說是從指定的開始時間開始計時,而不是從執行時間開始計時。

但是上面如果用schedule方法,間隔時間是3分鐘,指定開始時間是2005/12/30 14:10:00,那麼在14:17:00分執行這個程式,則立即執行程式一次。並且下一次的執行時間是 14:20,而不是從14:10開始算的週期(14:19)。

需要注意的是scheduleAtFixedRate和schedule在引數完全相同的情況下,執行效果是不同的。上面例子中任務只是列印一個字串,比較簡單。但如果任務比較複雜,或者由於任何原因(如垃圾回收或其他後臺活動)而延遲了某次執行,則scheduleAtFixedRate方法將快速連續地出現兩次或更多的執行,從而使後續執行能夠“追趕上來”;而schedule方法的後續執行也將被延遲。所以,在長期執行中,scheduleAtFixedRate執行的頻率將正好是指定週期的倒數,schedule 執行的頻率一般要稍慢於指定週期的倒數。

scheduleAtFixedRate 效率總體上高於schedule