首先,請原諒我可憐的英語= S其次,對不起,如果我的標題有點奇怪,我不知道如何更好地制定它。同步兩個不知道對方的線程[Java]
我有一點問題。我正在用Java開發一款遊戲,並且按照它教給我的方式使用MVC模式。我不知道這是否是最有效的方式,但總的來說,這裏是整體: 4個軟件包:模型,視圖,控制器和「觀察者」。
在觀察者中,有一個接口「Observer」,其中定義了一個元素「觀察模型」應該實現的所有方法。還有一個類「Observable」,有一個觀察者列表,以及所有通知他們一些變化的方法(像「fireEvent1(int i){for(Observer obs:observers)obs.Event1(i);}」 ) 該模型擴展了Observable類,GUI的一些元素實現了接口Observer。
現在我的問題是:在模型的方法中,我希望模型「等待」2個用戶交互。這意味着類似的東西:
- 方法稱爲模型
- 做一些東西
- 等待用戶交互的第一時間
- 獲取關於用戶只是做信息(這是收集在DC型)
- 做一些東西
- 等待用戶交互的第二次
- 獲取信息
- 做的東西
- 端
一個精度:用戶的交互被收集在其中實現的ActionListener的CONTROLER,和視圖的元件具有作爲CONTROLER的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();
}
這裏是可觀察和觀測CLASSE /接口:
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);
}
+ 1爲一個非常完整和描述性的問題! (meh,不能寫「+1」) – fge
是的,可以用'wait'和'notify'來做到這一點。我想告訴你你做錯了什麼,但是你沒有向我們展示任何代碼。 –
沒有代碼示例是不可能的。我甚至不能說我完全按照你的問題。如果您使用的是Swing/AWT或SWT/JFace,那麼線程通常會爲您生成,因此您只需實現/擴展正確的接口/類,並且如果您有超過1個線程訪問相同的數據,則只需在某處添加一個'synchronized'關鍵字或3個。如果你把它作爲一個獨立的服務器應用程序來完成,沒有像Spring,JEE等那麼好的框架,那麼你可能必須自己處理線程,並使用'synchronized'或'wait' /'notify' /'notifyAll'等被別人提及。 –