2012-01-29 37 views
9

我想要一個類,每2秒更改一次自己的私有變量。我知道,如果我這樣做在Java中創建一個重複的計時器提醒

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.schedule(new ChangeSomething(), 2000); 

它將執行​​2秒後,有沒有辦法來告訴它做一些事情每2秒,或者,如果我把裏面的​​

timer.schedule(new ChangeSomething(), 2000); 

它會工作嗎?

在旁註上,timer.cancel()究竟是幹什麼用的?

回答

11

使用timer.scheduleAtFixedRate()安排它每兩秒鐘復發:

安排指定的任務進行重複的固定速率執行,在指定的時間開始。隨後的執行大致按規定的時間間隔進行,並按指定的時間間隔分開。

從Javadoc文檔Timer.cancel()

終止此計時器,丟棄所有當前已安排的任務。不干擾當前正在執行的任務(如果存在)。一旦計時器被終止,它的執行線程將優雅地終止,並且不會安排更多的任務。

編輯:

與內部執行線程的Timer執行單一任務一次:

的最後一次現場引用Timer對象後消失,所有未完成的任務已完成執行時,定時器的任務執行線程正常終止(並且成爲垃圾收集的對象)。但是,這可能需要很長時間才能發生。默認情況下,任務執行線程不會作爲守護進程線程運行,因此它能夠阻止應用程序終止。如果調用者想要快速終止定時器的任務執行線程,調用者應該調用定時器的取消方法。

+0

我不明白什麼timer.cancel(),無論是它的要求做我做任務是有人經過只安排一次,以確保它不會再被完成或沒有? – SIMEL 2012-01-29 13:16:13

+0

定時器的Javadoc指示這不是必需的,定時器的執行線程將終止。但是,它明確指出,這可能需要很長時間,'cancel()'可以用來更快地終止它。 (從Javadoc的相關段落回答)。 – hmjd 2012-01-29 13:22:13

0

更確切地說:ChangeSomething()是ChangeSomething類的構造函數。當您將ChangeSomething instace對象傳遞給定時器時,不會在2秒後立即執行構造函數。這是該對象的run()方法將在2秒後觸發。

若要執行run()方法反覆所有2秒,使用schedule(TimerTask task, long delay, long period)

6

您需要調用定時器的不同的調度方法,稱爲scheduleAtFixedRate(...),可以得到3個參數。前2個與您使用的時間表相同,而第三個參數表示連續任務執行之間的時間段(以毫秒爲單位)。

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000); 

您可以檢查Java文檔PAI在這裏這個方法:http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask,java.util中。日期,長)

2

下面是一個例子

import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Test extends TimerTask { 
    private int age; 

    public Test() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(this, new Date(), 2000); 
    } 

    /** 
    * Implements TimerTask's abstract run method. 
    */ 
    public void run(){ 
     //toy implementation 
     System.out.print("Changing Data ... before change age is "+age+" "); 
     changeAge(); 
     System.out.println("after change age is "+age); 

    } 


    private void changeAge() { 
     age = (int)Math.round(Math.random()*1000); 
    } 

    public static void main(String[] args) { 
      new Test(); 
    } 

}

+0

new Timer(); =不可能你需要添加參數嗎? – 2014-01-09 00:32:04

+0

@SvenB根據Java文檔:http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html,Timer有一個默認的構造函數。 – 2014-01-17 01:15:53