【发布时间】:2013-05-24 10:40:02
【问题描述】:
我已经尝试解决这个问题两天了,我终于放弃了,我在这里发布我的代码,希望有人可以为我提供我所缺少的东西,因为我认为我是关闭,请帮忙!
理发师代码:
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;
【问题讨论】:
-
您看到任何异常吗?看起来你只是在捕捉异常。至少打印堆栈跟踪。
-
我打印出来了,但是因为我想让代码更容易阅读所以删除了它们。
-
cutHair() 和 getHaircut() 方法有什么作用?有什么东西会抛出 InterruptedException 吗?
-
你能贴出完整的代码吗?
标签: java multithreading semaphore