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

标签 java thread-sleep jslider

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

相关文章:

java - Eclipse 类突然找不到

java - 在 getRuntime().exec 中使用引号

java - 如何双倍缓冲矩形

java - 用于 double 的 JSlider

java - SLF4J,通用日志记录,控制台输出

Java线程监控。如何找出非守护程序 Activity 线程?

java - 启动画面中的线程

Python线程中断休眠

java - 更改监听器在 JSlider 中造成阻碍

Java:为 slider 添加一个 "accept"按钮