如何停止多个线程更新全局变量?

时间:2020-08-26 05:13:34

标签: java android multithreading

我正在开发音乐播放器应用程序。

我正在线程内更新一个名为“ songPosition”的全局变量。问题在于,每当切换歌曲时,它都会创建一个新线程,但是旧线程仍在后台运行,并且还会增加全局变量。这导致变量增加得比我想要的快。

是否有一种方法可以停止旧线程的运行,以使该问题不再持续?

代码:

private int songPosition;

new Thread(){
    public void run(){
        songPosition = 0;
        while (songPosition < songDuration){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // here is the variable being incremented
            songPosition++;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    seekBar.setProgress(songPosition); //This requires the variable to be final which is why I have a global variable
                    songPositionTextView.setText(String.valueOf(songPosition));
                }
            });
        }
    }
}.start();

2 个答案:

答案 0 :(得分:0)

歌曲位置在当前线程的上下文中是局部的。您可以在此处使用ThreadLocal变量。

您还可以使用期货使用可取消任务。

答案 1 :(得分:0)

如果要在多个线程之间共享变量,请回答您的问题,然后用“ volatile”声明,以便所有这些线程将直接从其内存中读取该变量的最新数据。

首先,您必须将新创建的线程实例添加到列表中(如果要处理更多的线程),以便稍后可以轻松中断所有正在运行的线程。如果要杀死特定线程,请使用ConcurrentMap ,该键可能是该线程的唯一名称,并将其添加到地图中。

相关问题