【问题标题】:How can Runnable modify a final local variable [closed]Runnable如何修改最终的局部变量[关闭]
【发布时间】:2013-03-12 01:57:55
【问题描述】:

我试图找出我的用户界面何时运行,并且有一个聪明的想法,即向 uiThread 发布一个可运行的对象,它唯一的工作就是设置一个标志。我尝试在uiIsRunning 上使用volatile 关键字,但eclipse 不允许这样做,我还不明白。

但令我惊讶的是,当我在uiIsRunning 上尝试下面没有 final 修饰符的代码时,我被正确地告知如果该局部变量是 final,我只能在嵌入式类中使用局部变量。所以我做了uiIsRunning final,令我惊讶的是,Eclipse 对我的uiIsRunning = true; 行完全没问题,也就是说,Eclipse 认为我可以在这个嵌套类中设置我的final 变量的值!

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

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

【问题讨论】:

标签: java android multithreading final volatile


【解决方案1】:

奇怪的是,您似乎能够修改 final 变量。但更重要的是,在您的情况下,您可以执行以下操作:

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;
            }
        });
    }
}

【讨论】:

  • 我认为他不能修改它。局部字段,为了在同一方法内声明的其他线程中具有可见性,需要声明为 final。
  • 两个code-sn-ps一起跑;澄清。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以通过在您的方法之外实例化它来访问多个线程中的字段(这样,而不是“局部变量”)。

    private int sharedInt = 0;
    
    public void someMethod() {
    
        // sharedInt will be visible inside this thread.
        Thread thread = new Thread(new Runnable() {....});
    
    }
    

    【讨论】:

    • 不回答问题。
    • 和接受的答案几乎一样。
    【解决方案4】:

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

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

    cannot assign a value to final variable uiIsRunning
    

    不是一个真正的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      相关资源
      最近更新 更多