みなさん、良い一日を!
Javaマルチスレッドの問題を解決するのに助けが必要です。問題はユニセックスのコンフォートルームです。
- コンフォート ルーム ユニセックスを作成します。
- 男性がいる場合、男性は入ることができます(その逆)
- 男性が使用している場合、女性は入場できません(その逆)
- 公正使用
- 飢餓はありません
これまでのところ、私は何か近いものを思いつきましたが、公正な使用に問題があり、女性を使用している男性は入ることができず、飢えています. これについて助けが必要です。
import java.util.Random;
import java.util.concurrent.Semaphore;
public class Try2 extends Thread {
public static Semaphore USERS = new Semaphore(0);
public static Semaphore PUBLIC_CR = new Semaphore(0);
public static Semaphore USAGE = new Semaphore(1);
public static final int LIST = 3;
public static int a = 0;
public static int c = 0;
public static int VACANCY = LIST;
class MEN extends Thread {
int iD;
boolean notUsed = true;
public MEN(int i) {
iD = i;
}
public void run() {
while (notUsed) {
try {
USAGE.acquire();
if (VACANCY > 0) {
System.out.println("MALE " + this.iD + " Is USING");
VACANCY--;
USERS.release();
USAGE.release();
try {
PUBLIC_CR.acquire();
notUsed = false;
this.USING_THE_CR();
} catch (InterruptedException ex) {
}
} else {
USAGE.release();
notUsed = false;
}
} catch (InterruptedException ex) {
}
}
}
public void USING_THE_CR() {
System.out.println("MALE " + this.iD + " is done USING the Comfort Room");
try {
sleep(1000);
} catch (InterruptedException ex) {
}
}
}
class WOMEN extends Thread {
int iD;
boolean notUsed = true;
public WOMEN(int i) {
iD = i;
}
public void run() {
while (notUsed) {
try {
USAGE.acquire();
if (VACANCY > 0) {
System.out.println("FEMALE " + this.iD + " Is USING");
VACANCY--;
USERS.release();
USAGE.release();
try {
PUBLIC_CR.acquire();
notUsed = false;
this.USING_THE_CR();
} catch (InterruptedException ex) {
}
} else {
USAGE.release();
notUsed = false;
}
} catch (InterruptedException ex) {
}
}
}
public void USING_THE_CR() {
System.out.println("FEMALE " + this.iD + " is DONE USING the Comfort Room");
try {
sleep(1000);
} catch (InterruptedException ex) {
}
}
}
class BATHROOM extends Thread {
public BATHROOM() {
}
public void run() {
while (true) { // runs in an infinite loop
try {
USERS.acquire();
USAGE.release();
VACANCY++;
PUBLIC_CR.release();
USAGE.release();
this.USING();
} catch (InterruptedException ex) {
}
}
}
public void USING() {
System.out.println("The Comfort Room is occupied");
try {
sleep(1000);
} catch (InterruptedException ex) {
}
}
}
public static void main(String args[]) {
Try2 BR = new Try2();
BR.start(); // Let the simulation begin
}
public void run() {
BATHROOM b = new BATHROOM(); //WORKING THREADS ON BATHROOM
b.start();
/* THIS WILL GENERATE THE USERS*/
for (int i = 1; i < 16; i++) {
Random random = new Random();
int temp = random.nextInt(2);
if (temp == 0) {
a++;
MEN m = new MEN(a);
m.start();
} else {
c++;
WOMEN w = new WOMEN(c);
w.start();
}
try {
sleep(2000);
} catch (InterruptedException ex) {
};
}
}
}