Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Runnable如何修改最终的局部变量_Java_Android_Multithreading_Final_Volatile - Fatal编程技术网

Java Runnable如何修改最终的局部变量

Java Runnable如何修改最终的局部变量,java,android,multithreading,final,volatile,Java,Android,Multithreading,Final,Volatile,我试图找出我的用户界面何时在运行,我有一个聪明的想法,就是向uiThread发布一个runnable,uiThread的唯一任务就是设置一个标志。我试图在uiIsRunning上使用volatile关键字,但eclipse不允许这样做,我还不明白这一点 但令我惊讶的是,当我在uiIsRunning上尝试下面的代码而没有使用最终修饰符时,我被正确地告知,如果局部变量是最终的,我只能在嵌入式类中使用局部变量。因此,我将uiIsRunning设置为final,令我惊讶的是,Eclipse完全可以使用我

我试图找出我的用户界面何时在运行,我有一个聪明的想法,就是向uiThread发布一个runnable,uiThread的唯一任务就是设置一个标志。我试图在uiIsRunning上使用volatile关键字,但eclipse不允许这样做,我还不明白这一点

但令我惊讶的是,当我在uiIsRunning上尝试下面的代码而没有使用最终修饰符时,我被正确地告知,如果局部变量是最终的,我只能在嵌入式类中使用局部变量。因此,我将uiIsRunning设置为final,令我惊讶的是,Eclipse完全可以使用我的uiIsRunning=true;,这就是Eclipse认为我可以在这个嵌套类中设置最终变量的值

如果有人能告诉我我需要做什么才能得到我想要的动作:在我当前的线程中将标志设置为false,然后在我发布它的线程执行它时将其设置为true,我将不胜感激

        final boolean uiIsRunning = false;
        uiHandler.post(new Runnable() {
            @Override
            public void run() {
                uiIsRunning = true;
            }
        });

奇怪的是,您似乎能够修改最后一个变量。但更重要的是,在您的案例中,您可以做以下几点:

public class SurroundingActivity extends Activity {

    volatile boolean uiIsRunning = false;
    private Handler uiHandler;

    void someMethod () { 
        uiHandler.post(new Runnable() {
            @Override
            public void run() {
                SurroundingActivity.this.uiIsRunning = true;
            }
        });
    }
}

通过在方法外部实例化字段,而不是局部变量,可以访问多个线程中的字段

private int sharedInt = 0;

public void someMethod() {

    // sharedInt will be visible inside this thread.
    Thread thread = new Thread(new Runnable() {....});

}
cannot assign a value to final variable uiIsRunning

当您将其用作标志时,应该使用volatile关键字并将其设置为Classic的变量而不是局部变量,就像您所做的那样。注意,volatile变量只能由唯一的线程修改。如果您想通过多个线程对其进行修改,您应该查看同步或原子对象

Runnable如何修改最终的局部变量

不可能。除非变量是成员变量而不是局部变量,否则代码示例不会编译

private int sharedInt = 0;

public void someMethod() {

    // sharedInt will be visible inside this thread.
    Thread thread = new Thread(new Runnable() {....});

}
cannot assign a value to final variable uiIsRunning

这不是一个真正的问题。

为什么要将一个局部变量共享给多个线程?你不能。代码无法编译。这不是一个真正的问题。我认为他不能修改它。本地字段要在同一方法中声明的其他线程中具有可见性,需要声明为final;澄清。不回答问题。这几乎与接受的答案相同。