Java セマフォを使用してこの問題を解決する必要がありますが、方法がわかりませんし、関連する Java 資料も見つかりません。これはそれがどのようになるかです:
スレッドには、男性と女性の種類があります。どちらも、BATHROOM_SIZE の同じリソースを使用したいと考えています。5 つのルール:
- すべてのスレッドは、リソースを使用する必要があることを通知した後、それを使用できるようになるまで待機する必要があります。
- BATHOOM_SIZE を超えるスレッドが同時にリソースを使用している状況を回避します。
- 女性と男性が同時にバスルームを使用するのを防ぎます。
- スレッドは同時にリソースを使用する必要があります。1 つのタイプのスレッドが多数ある場合、最大 BATHROOM_SIZE のスレッドがリソースを使用する必要があります。
- 飢餓を防ぎます。
結果
対象:
女性1名、男性1名、女性5名、男性5名
失敗:
5女1男、5男1女、2男2女、5男5女。
私は月曜日からそれを機能させようとしてきましたが、今ではアイデアが尽きてしまいました。
コード
したがって、私の仕事は、BathroomInterface を実装する Bathroom.java クラスを作成することです。
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();
}
}
}
}