繁体   English   中英

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

[英]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更改为动态的任何想法将不胜感激。

谢谢!

问题是你的valvolatile所以每当main Thread更新变量的runnable() Thread无法查看。

同样,请确保将running变量(在while循环内使用)标记为volatile ,否则runnable()线程将永远运行(不会从另一个线程接收更新)。

什么是挥发物? 这是什么意思?

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

我建议您通过参考这里了解线程通信的基础知识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM