【发布时间】:2012-03-15 19:11:01
【问题描述】:
如何根据复杂模型的一部分是否产生正确的标志在控制器中进行?
控制器类正在播放 Midi 序列队列,同时持有通过用户按钮动态更新的模型类的实例。在 Midi 队列结束后,控制器需要与模型同步,以检查用户是否进行了一定数量的条目,然后再继续更新界面并移动到应用程序的下一部分。除了用户按钮按下的 ArrayList 之外,Model 还表示相当多的其他数据,因此挑战在于如何最好地划分同步部分。
现在,我正在尝试的模式类似于以下,由于控制器和模型之间的嵌套类访问,它不起作用:
//Controller
...
Thread entriesCoordination = new Thread( new Model.InnerClass);
entriesCoordination.start();
Thread t = new Thread (this);
t.run();
...
//in runnable nested class in controller
private Model.InncerClass c = new Model.InnerClass();
public void run() {
synchronized( c) {
while (!c.hasFinishedEntries()){
try{
c.wait();
} catch (InterruptedException ignore{}
}
}
}
//Midiqueue completed and Entries finished
}
//in Model
//in runnable nested class in Model
public synchronized boolean hasFinishedEntries() {
return fIsFinishedWithEntries;
}
public void run() {
while(true) {
try{
synchronized(this) {
try{
if(entriesArray.size() == max_size) {
fIsFinishedWithEntries = true;
notifyAll();
} else {...}
}
}
}
}
}
此外,这似乎很浪费,因为它基本上意味着我需要创建一个线程并在用户可以进行这些按钮选择的整个持续时间内并行运行 Model 的内部类,而不是当我知道 Midi 队列已经结束时,只会轮询 Model。
从Controller 类到synchronize 到Model 类中的一个标志的设计模式是什么,而不必为了处理同步而在模型中创建内部类。
【问题讨论】:
标签: java model-view-controller design-patterns concurrency inner-classes