我有一个线程 z
,它是在单击某个 JButton begin
时创建的。在该线程的 run 方法中,我需要包含一个动态变量 val ,它会定期更改其值。 Val
已在全局声明。
此更改由 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
确保数据不会被缓存,而是始终从主内存写入/获取。
我建议您引用here来了解线程通信的基础知识。 。
关于java - 在 Java 中将动态变量与线程一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40853094/