定时器不能使用主功能的所有参数

时间:2014-10-12 06:42:05

标签: java

这是我第一次在Java中使用计时器方法,它看起来并不像我过去在其他语言中使用的其他计时器方法那样简单(即C ++)

我想要一个每隔一秒左右调用一次的函数,而我在其他多个线程中在后台发生其他事情。

我遇到了一个似乎在main函数内部工作的方法,只要在timer函数中引用的变量被定义为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...
    }
}

1 个答案:

答案 0 :(得分:0)

我可以看到两个解决方案。首先,您创建一个类StringWrapper,它只包装String并提供一个getter和一个setter。因此,您可以将其声明为final并在执行期间更改其值。

我建议的另一个解决方案是将String声明为属性(静态与否取决于其角色,但在当前代码中它只能是静态的),然后是{

。不再需要{1}}关键字。

编辑:

JB Nizet 观察到它时,请注意,如果多个线程同时使用此变量,则需要同步。在第一种情况下,您将在getter / setter代码中执行此操作,在第二种情况下,您不应直接访问该属性并实现线程安全的getter和setter。