我需要很多帮助。所以任务是模拟咖啡店。这是一个有5个座位的咖啡店。如果您在空座位时到达,您可以立即就座。但是如果你在所有5个座位都满了的时候到达,那就意味着所有的顾客都在喝咖啡 在你坐下之前,你必须等待整个派对离开(所有5个席位都免费)。
必须使用Threads强制执行此操作。客户数量作为命令行参数传递。
无论如何,我无法弄清楚如何解决这个问题。
我在想 - 我应该使用提供的Semaphore类,并且我要制作两个类型的队列" CustomerThread"并且其中一个是当前饮用的客户的队列,另一个排队等待客户排队等候?或者排队等候的人是否应该是BlockedQueue?但是,我不确定如何执行5席规则。例如,如果说两个线程完成并离开商店,那么将打开两个座位,但是直到所有5个座位都打开,我们无法将接下来的五个添加到饮用队列并从等待队列中删除。
答案 0 :(得分:0)
值得查看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
请注意,您不需要拥有自己的等待队列,因为brctl show | awk 'NF>1 && NR>1 {print $1}'
为您维护一个等待的线程队列。