gpt4 book ai didi

java - 线程执行 run() 方法两次

转载 作者:行者123 更新时间:2023-11-29 18:28:00 24 4
gpt4 key购买 nike

我创建了一个扩展 Thread 类的类,我用它来显示音乐播放器的进度。下面是我分享的代码 fragment ,

 @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() 方法时,线程开始运行,其中 estimatedMillis 的值必须递增 1000,而递增 2000。在 Logcat 中它显示日志语句执行了两次,而我希望它每秒递增 1000。

请指导我解决这个问题。

最佳答案

您的isPaused 不是volatile 变量,因此JVM 不保证在线程之间共享最新的值。使用 volatile 变量可以降低内存一致性错误的风险,因为对 volatile 变量的任何写入都会建立一个happens-before relationship 与同一变量的后续读取

isPaused 更改为 volatile static volatile boolean isPaused = true; 将解决您的问题。

关于java - 线程执行 run() 方法两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com