首先,请原谅我可怜的英语= S第二,对不起,如果我的标题有点奇怪,我不知道如何更好地表达它。
我有点问题。我正在开发一个Java游戏,我正在按照它的方式使用MVC模式。我不知道这是否是最有效的方式,但无论如何,总的来说: 4个包:model,view,controler和“observer”。
在观察者中,有一个接口“Observer”,其中定义了“观察模型”元素应该实现的所有方法。还有一个“Observable”类,带有一个观察者列表,以及通知它们一些变化的所有方法(像“fireEvent1(int i){for(Observer obs:observers)obs.Event1(i);}”这样的方法) 该模型扩展了Observable类,GUI的一些元素实现了Observer接口。
现在我的问题是:在模型中的方法中,我希望模型“等待”2个用户交互。这意味着:
一个精度:在实现ActionListener的控制器中收集用户的交互,并且视图的元素将控制器作为ActionListener。
所以我想我必须使用线程,但尽管我找到了所有教程和例子,但我仍然无法完成这项工作。我试图在模型中启动一个线程,让它等待,但我无法在控制器中创建另一个线程,与第一个线程同步并在必要时通知它。我甚至不知道这是否是正确的做法,无论如何,我已经解决了这个问题几个小时,我只是不知道如何解决它。
我希望我的解释清楚,如果没有,请随意提问,然后我会尝试写一个代表我问题的简单代码。
感谢您的帮助
Scentle5S
编辑: 这是一个代表我的问题的小代码。所以我希望模型能够从视图中获取信息,一个接一个,只有两次。我在模型中启动一个线程并让它等待(顺便说一句,我看到很多次无限循环使线程等待,但我不明白为什么它是必要的。不会简单的调用wait() ,没有循环,也做这个工作?)。
但很明显,此处没有其他线程与模型同步,该模型能够在执行操作时通知并传输数据。
我不知道怎么做这样的事情。
public class Model extends Observable {
public void waitForActions() {
System.out.println("Wating for two user's actions");
Thread t = new Thread() {
public void run() {
while (true) {
try {
wait();
} catch (InterruptedException e) {
}
}
System.out.println("First action received in model : "
+ message);
while (true) {
try {
wait();
} catch (InterruptedException e) {
}
}
System.out.println("Second action received in model : "
+ message);
}
};
fireWaitForActions(true);
t.start();
fireWaitForActions(false);
}
}
public class Controler implements ActionListener {
private Model model;
public Controler(Model model) {
this.model = model;
}
public void actionPerformed(ActionEvent e) {
String message = ((JButton)e.getSource()).getText();
System.out.println("Action received in controler : "+message);
}
}
public class View extends JFrame implements Observer {
private JButton b1 = new JButton("Action 1");
private JButton b2 = new JButton("Action 2");
private Controler controler;
public View(Controler controler) {
this.controler = controler;
b1.addActionListener(controler);
b2.addActionListener(controler);
b1.setEnabled(false);
b2.setEnabled(false);
JPanel container = new JPanel();
container.add(b1);
container.add(b2);
setContentPane(container);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public void waitForActions(Boolean b) {
b1.setEnabled(b);
b2.setEnabled(b);
}
}
public static void main(String[] args) {
Model model = new Model();
Controler controler = new Controler(model);
View view = new View(controler);
model.addObserver(view);
model.waitForActions();
}
以下是Observable和Observer classe / interface:
public class Observable {
private LinkedList<Observer> observers = new LinkedList<Observer>();
public void addObserver(Observer obs) {
observers.add(obs);
}
public void fireWaitForActions(boolean b) {
for (Observer obs: observers) obs.waitForActions(b);
}
}
public interface Observer {
public void waitForActions(Boolean b);
}
答案 0 :(得分:0)
有很多方法可以做到这一点。查看Java语言手册中的线程同步方法。
您可以对两个线程都可以看到的Object使用wait()和notify()。 您可以在两个线程都可以看到的信号量上使用acquire()和release()。 您可以使用阻塞队列构建解决方案。
wait()/ notify()或acquire()/ release()可能最简单。
答案 1 :(得分:0)
要同步两个(或多个线程)无法相互了解,您需要两个线程共有的对象。您可以轻松使用
中的锁定java.util.concurrent.locks
包。
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-summary.html
例如,创建一个ReentranceLock并简单地使用
.lock()
和
.unlock()
答案 2 :(得分:0)
我认为你或你误解了自己的要求会引起一些令人困惑的解释。每当有一个请求进入您的Web容器时,它将创建一个用于处理该srequest的线程。你在谈论那些线索还是你能解释你想要在细节中满足的要求是什么?