我有一个后台线程,在start
变量变为true
之前不会开始处理:
class MyBackgroundThread implements Runnable {
// ...
public void run() {
while(true) {
if(!start) continue;
doSomethingWith(myValue);
}
}
}
通过单击start
上的按钮将JFrame
变量设置为true,该按钮当然在事件调度线程上运行。后台线程类中还有一个myValue
字段,可以通过单击按钮来设置:
startBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
backgroundThreadInstance.setMyValue(100);
backgroundThreadInstance.setStart(true);
// ...
}
});
正如您所看到的,在将myValue
设置为start
之前,它会为true
分配一些内容。这是否意味着不需要将myValue
和start
设置为volatile
?由于myValue
被写入第一个,它将在start
之前泄露到后台线程,因此后台线程永远不会有机会处理未初始化的myValue
?
答案 0 :(得分:1)
简短的回答是肯定的。虽然在实践中,最终你的线程可能会看到真正的变化,理论上它可能永远不会发生。
但是,同意@NamshubWriter,有一种比繁忙/空闲循环更好的方法。我喜欢他设置整数然后将其提交给ExecutorService的提议。 e.g。
public void actionPerformed(ActionEvent e) {
BackgroundRunnableInstance runnable = new BackgroundRunnableInstance();
runnable.setMyValue(100); // could be in the constructor instead
someExecutorService.submit(runnable);
}
一个区别是,如果他们多次按下按钮,您将启动多个可运行的操作。哪个可能是你想要的,也可能不是。