0

我有一个后台线程,它不会开始处理,直到它的start变量变为true

class MyBackgroundThread implements Runnable {
    // ...

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

            doSomethingWith(myValue);
        }
    }
}

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

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

        // ...
    }
});

如您所见,它myValue在设置start为之前分配了一些东西true。这是否意味着设置myValuestartasvolatile不是必需的?由于myValue是先写的,所以会在之前泄露给后台线程start,因此后台线程永远不会有机会处理未初始化的myValue?

4

1 回答 1

1

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

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

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

一个区别是,如果他们多次点击按钮,您将启动多个可运行文件。这可能是也可能不是你想要的。

于 2013-02-05T21:32:25.897 回答