[英]Using a dynamic variable with threads in Java
我有一个单击某个JButton begin
时创建的线程z
。 在该线程的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()
线程将永远运行(不会从另一个线程接收更新)。
什么是挥发物? 这是什么意思?
简而言之,将变量标记为volatile
将使一个线程的写入对其他线程可见。 这是必需的,因为当线程正在向变量写入数据时,变量数据将被缓存(在线程本地),并且其他线程可能看不到它,直到写入线程刷新数据为止。 如此volatile
可确保不缓存数据,而始终从主内存写入/获取数据。
我建议您通过参考这里了解线程通信的基础知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.