0

私はServices を使用して音楽プレーヤー アプリケーションに取り組んでいます。サービスでは、すべての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()this の外からのみ呼び出されるメソッドです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;
}

それでも、メソッドは常にfalse にrun見えます。shouldPlayNext変数を次のように宣言してみました:

volatile boolean shouldPlayNext=false;

私は何が欠けていますか?ありがとう。

4

1 に答える 1

1

試す

volatile boolean shouldPlayNext=false;

スレッドは、キャッシュされた変数のコピーを保持できます。したがって、理論的には、実際の変数が変更された場合でも、スレッドはキャッシュされた古いコピーで作業を続けることができます。volatileキーワードは、変数への読み取り/書き込みをすべてのスレッドから見えるようにします。

于 2013-08-13T15:02:01.263 に答える