gpt4 book ai didi

java - 从 EDT : is volatile necessary? 传递数据

转载 作者:行者123 更新时间:2023-12-01 14:52:16 25 4
gpt4 key购买 nike

我有一个后台线程,在它的 start 变量变为 true 之前不会开始处理:

class MyBackgroundThread implements Runnable {
// ...

public void run() {
while(true) {
if(!start) continue;

doSomethingWith(myValue);
}
}
}

通过单击 JFrame 上的按钮将 start 变量设置为 true,该 JFrame 当然是在事件调度线程上运行的。后台线程类中还有一个 myValue 字段,通过单击按钮来设置:

startBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
backgroundThreadInstance.setMyValue(100);
backgroundThreadInstance.setStart(true);

// ...
}
});

如您所见,在将 start 设置为 true 之前,它会向 myValue 分配一些内容。这是否意味着不需要将 myValuestart 设置为 volatile ?由于myValue首先被写入,它会在start之前泄漏到后台线程,因此后台线程将永远没有机会处理未初始化的myValue

最佳答案

简短的回答是肯定的。尽管在实践中,最终您的线程可能会看到对 true 的更改,但理论上它可能永远不会发生。

但是,同意@NamshubWriter的观点,即有比繁忙/空闲循环更好的方法来做到这一点。我喜欢他设置整数然后将其提交给 ExecutorService 的建议。例如

public void actionPerformed(ActionEvent e) {
BackgroundRunnableInstance runnable = new BackgroundRunnableInstance();
runnable.setMyValue(100); // could be in the constructor instead
someExecutorService.submit(runnable);
}

一个区别是,如果他们多次按下按钮,您将启动多个可运行程序。这可能是也可能不是您想要的。

关于java - 从 EDT : is volatile necessary? 传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716263/

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