我需要很多帮助。所以我们的任务是模拟一个咖啡店。这是一家有5个座位的咖啡店。如果你到达的时候有一个空座位,你可以立即就座。但是如果你到达时5个座位都坐满了,这意味着所有的顾客都在一起喝咖啡,你将不得不等待整个派对离开(所有5个座位都变得空闲)才能坐下。
这必须使用Thread来强制执行。客户数量作为命令行参数传入。
不管怎么说,我都不知道该怎么做。
我在想-我是否应该使用提供的信号量类,是否应该创建两个类型为"CustomerThread“的队列,其中一个队列用于当前正在饮酒的顾客,另一个队列用于排队等候的顾客?或者,排队等候的应该是BlockedQueue?然而,我不确定如何执行5个座位的规则。例如,假设两个线程完成并离开商店,将有两个空座位,但在所有5个线程都打开之前,我们不能将接下来的5个添加到饮酒队列并从等待队列中删除。
发布于 2016-05-01 04:52:54
值得一看的是Conditions,它们比Semaphores更容易定制,如果你没有这样的要求(当店满时,我们需要等待商店完全空了),那么Semaphore会是最好的,我们创建一个有5个permits的Semaphore,当人们进入时我们await,当他们离开时我们release。但是有了这些限制,Condition可能是更好的选择。
差不多吧。
static class CoffeeShop{
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
private int counter = 0;
public void enter() throws InterruptedException {
try{
lock.lock();
if(counter<5){
System.out.println(" in "+""+counter);
++counter;
}else if(counter==5){
System.out.println("shop is full");
while (counter>0) {
condition.await();
}
++counter;
System.out.println(" in "+""+counter);
}
}finally {
lock.unlock();
}
}
public void leave(){
try{
lock.lock();
--counter;
if(counter==0){
condition.signal();
}
}finally {
lock.unlock();
}
}
}请注意,您不需要拥有自己的等待队列,因为Condition为您维护了一个等待线程队列。
https://stackoverflow.com/questions/36959525
复制相似问题