我已经尝试解决这个问题两天了,我终于放弃了,我在这里发布我的代码,希望有人可以为我提供我所缺少的东西,因为我认为我很接近,请帮助!
理发师代码:
public Semaphore customer = new Semaphore(0);
public Semaphore barber = new Semaphore(0);
public Semaphore accessSeats = new Semaphore(1);
public int freeChairs = 5;
@Override
public void run() {
while (true) {
try {
customer.acquire(); //it seems the barber never acuires a customer, even after the semaphore is released
accessSeats.acquire();
freeChairs += 1;
cutHair();
barber.release();
accessSeats.release();
} catch (InterruptedException ex){}
客户代码:
public void run() {
while (notCut) {
try {
bs.accessSeats.acquire();
} catch (InterruptedException ex) {}
if (bs.freeChairs > 0) {
bs.freeChairs -= 1;
bs.customer.release();
bs.accessSeats.release();
try {
bs.barber.acquire(); //the customer cant get past this line
getHaircut();
} catch (InterruptedException ex) {}
} else {
bs.accessSeats.release();
notCut = false;
}
}
}
我在随机计时器上创建了 1 个理发师和 100 个客户。
编辑:cutHair()
让理发师线程休眠 1-5 秒(随机)。并getHaircut()
打印一条消息,然后设置notCut=false;