使用队列和信号量模拟客户/员工线程

问题描述 投票:1回答:1

我需要很多帮助。所以任务是模拟咖啡店。这是一个有5个座位的咖啡厅。如果您在空座位时到达,您可以立即就座。但是如果你在所有5个座位都已满的时候到达,这意味着所有的顾客都在一起喝咖啡,你必须等待整个派对离开(所有5个座位都免费)才能坐下来。

必须使用Threads强制执行此操作。客户数量作为命令行参数传入。

无论如何,我无法弄清楚如何解决这个问题。

我在想 - 如果我使用提供的Semaphore类,我是否会创建两个类型为“CustomerThread”的队列,并且其中一个队列是当前正在喝酒的客户的队列,另一个队列是排队等候的客户?或者排队等候的人是否应该是BlockedQueue?但是,我不确定如何执行5席规则。例如,如果说两个线程完成并离开商店,那么将打开两个座位,但是直到所有5个座位都打开,我们无法将下五个添加到饮用队列并从等待队列中删除。

java queue semaphore thread-synchronization
1个回答
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会为您维护一个等待的线程队列。

© www.soinside.com 2019 - 2024. All rights reserved.