我必須用Java信號量來解決這個問題,但我不知道如何,也找不到任何相關的Java資料。這是怎麼回事:
Java男女皆宜的浴室
有各種線程:男人和女人。兩者都想使用相同的資源,其數量是BATHROOM_SIZE。 5規則:
- 每個線程,在信號需要使用資源後,都應該等到他能夠使用它。
- 當多於BATHOOM_SIZE線程同時使用資源時,防止出現這種情況。
- 防止女人和男人在同一時間使用澡堂。
- 線程應該同時使用資源。如果有一個類型的線程很多,則BATHROOM_SIZE線程應該使用資源。
- 預防飢餓。
結果
Works爲:
1woman,1man,5women,5men
失敗爲:
5women1men,5men1women,2men2women,5men5women。
自從星期一起,我一直在努力讓它工作,現在我已經用完了想法。
代碼
所以,我的任務是寫Bathroom.java類,它實現BathroomInterface:
public interface BathroomInterface {
public static final int BATHROOM_SIZE = 3; //3 is just example
void manEnter();
void manExit();
void womanEnter();
void womanExit();
}
在系統中有許多男人和女人螺紋,這樣工作的:
for(int i = 0; i < n; i++) {
bathroom.manEnter();
//uses bathroom random amount of time
bathroom.manExit();
}
for(int i = 0; i < m; i++) {
bathroom.womanEnter();
//uses bathroom random amount of time
bathroom.womanExit();
}
我也有計劃Bathroom.java類,我不得不延長:
import java.util.concurrent.Semaphore;
public class Bathroom implements BathroomInterface {
private Semaphore mutex = new Semaphore(1, true);
public void womanEnter() {
mutex.acquireUninterruptibly();
}
public void womanExit() {
mutex.release();
}
public void manEnter() {
mutex.acquireUninterruptibly();
}
public void manExit() {
mutex.release();
}
}
這是我迄今所取得:
import java.util.concurrent.Semaphore;
public class Bathroom implements BathroomInterface {
int manW=0, manU=0, womanW=0, womanU=0; //*U-using, *W-waiting
private Semaphore mutex = new Semaphore(1, false);
public void womanEnter() {
womanW++;
StateChange();
}
public void womanExit() {
womanU--;
mutex.release();
StateChange();
}
public void manEnter(){
manW++;
StateChange();
}
public void manExit() {
manU--;
mutex.release();
StateChange();
}
void StateChange() {
if(womanU==0 && manU==0) {
if(manW>womanW) {
while(manW>0 && manU<BATHROOM_SIZE) {
manW--;
manU++;
mutex.acquireUninterruptibly();
}
}
else {
while(womanW>0 && womanU<BATHROOM_SIZE) {
womanW--;
womanU++;
mutex.acquireUninterruptibly();
}
}
}
if(womanU==0 && manU<BATHROOM_SIZE) {
while(manW>0 && manU<BATHROOM_SIZE) {
manW--;
manU++;
mutex.acquireUninterruptibly();
}
}
if(manU==0 && womanU<BATHROOM_SIZE) {
while(womanW>0 && womanU<BATHROOM_SIZE) {
womanW--;
womanU++;
mutex.acquireUninterruptibly();
}
}
}
}
「失敗」的意思是什麼?它會死鎖,崩潰,凍結,拋出異常,...?請記住,您提供的細節越多,獲得的幫助就越多。 –
好的,我有一些問題。如果你的浴室有更多的容量,爲什麼你使用size = 1的信號量?信號量是爲了自動管理多個相同類型的資源而創建的。 – Th0rndike
只是很搞笑! –