2014-10-12 72 views
0

了我第一次在Java中使用定時器方法,它似乎並不像我在其他語言中使用過其它定時器的方法一樣簡單(即C++)計時器不能使用所有參數的主要功能

我想有一個函數,每秒鐘都會調用,而在其他多個線程的背景中發生其他事情。

我碰到一個方法,似乎在主函數內部工作,只要定時器函數中引用的變量被定義爲final。一個變量我不能作爲final,所以我在定時器函數中引用它時遇到了問題。

所以,我的問題是,這是使用計時器方法的好方法嗎?請記住,我可能需要在定時器功能中使用大量的項目?還是使用不同的方法訪問單變量引用讓我悲傷?這個解決方案可能很簡單,如果是這樣的話,我很抱歉,這是一個漫長的一天,而且我正處於一個讓我的大腦偶爾關閉的最後期限。

感謝任何幫助/建議等

這裏是我的代碼如下所示:

public static void main(String[] args) { 

    Timer timer = new Timer(); 
    String StringThatWillBeChangingOften = ""; 
    final String finalString = "abc"; 

    try{ 

     timer.scheduleAtFixedRate(new TimerTask() { 

      String s = StringThatWillBeChangingOften; //ERROR ON THIS LINE 

      public void run() { 
       //Referencing other variables from main works fine as long they are defined as final 
       //ie finalString works fine 
      } 
     }, 1000, 1000); 

    //Catch... 
    } 
} 
+0

當您的Timer的run()方法被執行時,您是否希望它使用它在創建計時器時所具有的'StringThatWillBeChangingOften'的值,或者是否希望它使用它的'StringThatWillBeChangingOften'值現在呢? – 2014-10-12 06:45:53

+0

它可以被視爲通過參考傳遞 - 不會改變它在計時器內 – DenizC 2014-10-12 07:03:06

+0

這並不真正回答我的問題。 – 2014-10-12 07:08:48

回答

0

我可以看到你的問題兩個解決方案。首先,你創建一個類StringWrapper,它簡單地包裝一個String並提供一個getter和一個setter。因此,您可以在執行過程中聲明它並更改其值。

另一個我會推薦的解決方案是將String聲明爲一個屬性(靜態或不依賴於它的角色,但在當前代碼中它只能是靜態的),那麼final關鍵字不會被要求了。

編輯:

作爲JB Nizet觀察到它,請注意,如果該變量是要由多個線程同時使用時,同步是必需的。在第一種情況下,您可以在getter/setter代碼中執行此操作,而在第二種情況下,您不應直接訪問屬性並實現線程安全的getter和setter。

+0

在這兩種情況下,需要同步來訪問該字段,因爲一個線程在另一個線程讀取值時更改其值。 – 2014-10-12 06:50:18

+0

當然,但它是一個單獨的問題,不是嗎? – Dici 2014-10-12 06:51:25

+1

類別。但值得一提的是,國際海事組織。 – 2014-10-12 06:52:36