线程执行两次run()方法

时间:2019-09-07 07:53:05

标签: java android multithreading thread-safety progress-bar

我创建了一个扩展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。

请指导我解决此问题。

1 个答案:

答案 0 :(得分:2)

isPaused不是volatile变量,因此JVM不保证大多数更新值将在线程之间共享。使用易失性变量可以降低内存一致性错误的风险,因为任何对易失性变量的写入都会建立一个happens-before relationship并随后对该变量进行读取

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

相关问题