java - Runnable 内的标志(Android :Thread inside Service) not updating properly?

标签 java android thread-safety android-service runnable

我正在使用服务开发音乐播放器应用程序。在服务中,我在新线程中处理所有 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;

我错过了什么?谢谢。

最佳答案

尝试

volatile boolean shouldPlayNext=false;

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

关于java - Runnable 内的标志(Android :Thread inside Service) not updating properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18212571/

相关文章:

java - 空 JSON 响应不会在 Jackson 中触发错误

java - Spring注解与xml混合问题

c++ - tbb::concurrent_unordered_map::unsafe_erase 是否会使任何现有的迭代器失效?

ios - 如何将一个数组安全地从一个线程传递到另一个线程?

java - 如何检查大海捞针中的空值和空字符串?

java - 什么是NullPointerException,我该如何解决?

android - 如何更改操作栏/标题栏字体?

android - ViewPager 问题

android - 更改单选按钮旁边的文本字体?

c# - .NET ref 参数是线程安全的,还是容易受到不安全的多线程访问的影响?