2014-10-12 74 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