2014-12-30 19 views
4

首先,請原諒我可憐的英語= 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); 
} 
+2

+ 1爲一個非常完整和描述性的問題! (meh,不能寫「+1」) – fge

+0

是的,可以用'wait'和'notify'來做到這一點。我想告訴你你做錯了什麼,但是你沒有向我們展示任何代碼。 –

+0

沒有代碼示例是不可能的。我甚至不能說我完全按照你的問題。如果您使用的是Swing/AWT或SWT/JFace,那麼線程通常會爲您生成,因此您只需實現/擴展正確的接口/類,並且如果您有超過1個線程訪問相同的數據,則只需在某處添加一個'synchronized'關鍵字或3個。如果你把它作爲一個獨立的服務器應用程序來完成,沒有像Spring,JEE等那麼好的框架,那麼你可能必須自己處理線程,並使用'synchronized'或'wait' /'notify' /'notifyAll'等被別人提及。 –

回答

0

有許多方法可以做到這一點。查看Java語言手冊中的線程同步方法。

您可以在兩個線程都可以看到的對象上使用wait()和notify()。 您可以使用兩個線程都可以看到的Semaphore上的acquire()和release()。 您可以使用阻塞隊列構建解決方案。 ()/ notify()或acquire()/ release()可能是最簡單的。

0

我認爲它有點混亂的解釋給予你或你誤會了自己的要求。每當有一個請求到達你的Web容器時,它將創建一個處理請求的線程。你是在談論這些話題,還是你能解釋一下你想要在detai中遇到什麼要求?