在 Java 中对线程使用动态变量

Using a dynamic variable with threads in Java

我有一个线程 z,它是在单击某个 JButton begin 时创建的。在该线程的 运行 方法中,我需要包含一个定期更改其值的动态变量 valVal 已在全球范围内声明。 此更改由 JSlider 的 stateChanged 函数正确建模,它继续在控制台中打印出 val 的正确值。但是,在我的 run 方法中,变量 val 不会根据需要更改。它与线程创建时的初始值保持不变。

下面是我的函数:

int val;
Thread z;

public void actionPerformed(ActionEvent e) {

    if (e.getSource().equals(step)) {
        simulation();
    }

    else if (e.getSource().equals(begin)) {
        if (running==false) {
            running = true;
            z = new Thread(this);
            z.start();
        }
    }

    else if (e.getSource().equals(end)) {
        running = false;
    }
}

@Override
public void stateChanged(ChangeEvent e) {
    val = slider.getValue();
    System.out.println(val);
}

@Override
public void run() {
    while (running==true) {
        simulation();
        try {
            Thread.sleep(val+200); //SHOULD BE DYNAMIC
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

任何关于如何将变量 val 更改为动态的想法都将不胜感激。

谢谢!

问题是你的 val 不是 volatile 所以每当 main Thread 更新变量时 runnable() Thread 不是能够查看它。

同样确保将 running 变量(在 while 循环内使用)标记为 volatile,否则 runnable() 线程将永远 运行(没有收到来自其他线程的更新)。

What is volatile? What does it mean?

简而言之,将变量标记为volatile 可以使一个线程的写入对其他线程可见。这是必需的,因为当线程正在写入变量时,变量数据被缓存(线程本地)并且它可能对其他线程不可见,直到写入线程刷新数据。因此 volatile 确保数据不被缓存,而是始终 written/fetched 来自主内存。

建议你参考here了解线程通信的基础知识。