我必须使用 Java 信号量来解决这个问题,但我不知道如何,也找不到任何相关的 Java 材料。事情是这样的:
有各种各样的线程:男人和女人。两者都想使用数量为 BATHROOM_SIZE 的相同资源。5条规则:
- 每个线程在发出需要使用资源的信号后,都应该等到他能够使用它。
- 防止出现超过 BATHOOM_SIZE 个线程同时使用资源的情况。
- 防止女性和男性同时使用 Bathoom。
- 线程应该同时使用资源。如果一种类型有很多线程,最多 BATHROOM_SIZE 线程应该使用资源。
- 防止饥饿。
结果
效劳于:
1女1男5女5男
失败:
5女1男,5男1女,2男2女,5男5女。
从星期一开始,我一直在努力让它发挥作用,现在我已经没有想法了。
代码
所以我的任务是编写实现浴室接口的浴室.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();
}
我也有浴室.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();
}
}
}
}