这个类扩展了 Thread
,一旦创建,线程就会启动。以下是代码:
class Controller extends Thread implements ConfigurationObserver{
private int refreshMS;
//...
@Override
public void notifyConfiguration(ConfigurationModel config) {
refreshMS = config.getRefreshMs();
}
@Override
public void run() {
//...
while (true) {
try {
Thread.sleep(refreshMS);
} catch (InterruptedException ex) {
//...
}
}
}
}
这个类遵循观察者模式。该类将订阅ConfigurationController
,每当配置参数发生更改时,通过notifyConfiguration(...)
方法通知它。
让我有点不安的是refresMS
属性。配置通过GUI(线程#1)更改,并影响Controller
类(线程#2)的属性,该属性从该类的运行线程(线程#3)中读取。
Q1:这可能会成为竞态条件吗?
Q2:如果是,解决这个问题的最佳方法是什么?
refreshMS
声明为volatile
。 - pingw33nvolatile
,也会存在一种最小的竞态条件。 - Stephen Ctry...catch
之外,在while
循环内没有其他代码。否则你是正确的。 - pingw33n