我需要很多帮助。所以任务是模拟咖啡店。这是一个有5个座位的咖啡厅。如果您在空座位时到达,您可以立即就座。但是如果你在所有5个座位都已满的时候到达,这意味着所有的顾客都在一起喝咖啡,你必须等待整个派对离开(所有5个座位都免费)才能坐下来。
必须使用Threads强制执行此操作。客户数量作为命令行参数传入。
无论如何,我无法弄清楚如何解决这个问题。
我在想 - 如果我使用提供的Semaphore类,我是否会创建两个类型为“CustomerThread”的队列,并且其中一个队列是当前正在喝酒的客户的队列,另一个队列是排队等候的客户?或者排队等候的人是否应该是BlockedQueue?但是,我不确定如何执行5席规则。例如,如果说两个线程完成并离开商店,那么将打开两个座位,但是直到所有5个座位都打开,我们无法将下五个添加到饮用队列并从等待队列中删除。
值得一看Conditions,它们比Semaphores
更容易定制,如果你没有要求(当它已满时,我们需要等待商店完全空)然后一个Semaphore
将是最好的,我们创造了一个Semaphore
与5 permits
和我们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
会为您维护一个等待的线程队列。