gpt4 book ai didi

java - 在 Java 中将动态变量与线程一起使用

转载 作者:行者123 更新时间:2023-12-01 09:12:08 26 4
gpt4 key购买 nike

我有一个线程 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com