我正在完成一項任務,必須創建兩個類,一個代表一個人,另一個代表一個橋,另一個代表橋。只有一個人可以在任何時候「穿越」橋,但可能有人在等待穿越Java,多個線程,每次只執行一個線程
我很容易用多線程來實現這一點,允許多人同時跨越,但我遇到問題時改變它只允許一個線程運行...
我的主要問題是他們想要的類設計,我必須在人類中開始線程,但橋類需要能夠等待並通知他們開始/停止
任何想法我可以做到這一點?
我正在完成一項任務,必須創建兩個類,一個代表一個人,另一個代表一個橋,另一個代表橋。只有一個人可以在任何時候「穿越」橋,但可能有人在等待穿越Java,多個線程,每次只執行一個線程
我很容易用多線程來實現這一點,允許多人同時跨越,但我遇到問題時改變它只允許一個線程運行...
我的主要問題是他們想要的類設計,我必須在人類中開始線程,但橋類需要能夠等待並通知他們開始/停止
任何想法我可以做到這一點?
你可能要閱讀wait
和notify
。有一些谷歌搜索教程。
但是當你理解了他們之後,你想讓這個人對象調用wait
。然後你想要橋接對象調用notify
。當一個人物從wait
返回時,輪到他們交叉(因爲我理解你的問題)。當這個人交叉時,橋物體將再次呼叫notify
。
確保你的synchronize
正確。教程應該有所幫助。
我相信作業要求你做的是使用(或實現)互斥體訪問共享資源,即橋。 http://en.wikipedia.org/wiki/Mutex
鎖定這樣的對象:
// Bridge.java
public class Bridge {
private Object _mutex = new Object();
public void cross(Person p)
synchronized(_mutex) {
// code goes here
}
}
}
也就是說一個,可能是最簡單,方法..
編輯:
更容易:
public class Bridge {
public synchronized void cross(Person p)
{
// code goes here
}
}
嘗試的java.util.concurrent:
該類西港島線產生ExecutorService的,在那裏你可以提交YOUT 「人」。 Jobes排隊,一個人會在時間交叉。
在閱讀完yout後,我不確定,如果你可以將你的設計擴大到你的這個功能。 – 2010-10-28 09:34:19
使用同步方法似乎是最優雅的Java解決方案。提交者可以看到[「同步方法」](http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html),瞭解它的全部功能。它不會教會任何人有關信號量或互斥/條件的知識,但是它是指導者自己的錯,它選擇了像Java這樣的高級技術來教會像低級別的事情,例如在多線程之間同步訪問。 – 2010-10-18 23:10:53