我创建了一个扩展Thread类的类,该类用于显示音乐播放器的进度。以下是我共享的代码段,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
customThread = new CustomThread(String.valueOf(new Random().nextInt(10)));
}
public void playPauseBtn(View v){
if(isPaused){
isPaused = false;
customThread .start();
else{
isPaused = true;
}
}
static long totalDuration, estimatedMillis;
static boolean isPaused = true;
public class CustomThread extends Thread {
String name;
private CustomThread(String name) {
this.name = name;
}
@Override
public void run() {
while (!isPaused) {
try {
estimatedMillis = estimatedMillis + 1000;
setProgressData(estimatedMillis);
Log.v(TAG,"estimated Millis:"+estimatedMillis );
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这里的问题是,当我单击btn来执行playPauseBtn()方法时,线程开始运行,其中估计的Millis的值必须增加1000,而该值将增加2000。在Logcat中,它显示了Log语句执行了两次,而我希望它每秒可以增加1000。
请指导我解决此问题。
答案 0 :(得分:2)
您isPaused
不是volatile
变量,因此JVM不保证大多数更新值将在线程之间共享。使用易失性变量可以降低内存一致性错误的风险,因为任何对易失性变量的写入都会建立一个happens-before relationship
并随后对该变量进行读取
将isPaused
更改为易失性static volatile boolean isPaused = true;
将解决您的问题。