Runnable内的标志(Android:Thread inside Service)没有正确更新?

时间:2013-08-13 14:59:46

标签: java android thread-safety android-service runnable

我正在使用Service s处理音乐播放器应用程序。在服务中,我处理新线程中的所有MediaPlayer函数。这是我的类,它实现了Runnable

public class MusicPlayerThread implements Runnable {
    boolean shouldPlayNext=false;

 public void run {
    while(true) {
        if(shouldPlayNext)           //shouldPlayNext always is false
         //code to play next song
     }
 }

 public void playNext() {
    shouldPlayNext=true;            //although control reaches here..
 }
}

playNext()是一种仅从此Thread外部调用的方法。

所以我尝试这样做:

public void run {
    while(true) {
       if(getshouldPlayNext)       //code to play  next song
    }
}

synchronized public void playNext() {
shouldPlayNext=true;
}

synchronized public boolean getshouldPlayNext() {
return shouldPlayNext;
}

仍然,run方法始终将shouldPlayNext视为false。我甚至尝试将变量声明为:

volatile boolean shouldPlayNext=false;

我错过了什么?感谢。

1 个答案:

答案 0 :(得分:1)

尝试

volatile boolean shouldPlayNext=false;

线程可以保留变量的缓存副本。因此,理论上,即使实际变量发生更改,线程也可以继续使用旧的缓存副本。 volatile关键字使变量的读/写对所有线程都可见。