首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用队列和信号量模拟客户/员工线程

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

Stack Overflow用户
提问于 2016-05-01 03:53:55
回答 1查看 612关注 0票数 1

我需要很多帮助。所以我们的任务是模拟一个咖啡店。这是一家有5个座位的咖啡店。如果你到达的时候有一个空座位,你可以立即就座。但是如果你到达时5个座位都坐满了,这意味着所有的顾客都在一起喝咖啡,你将不得不等待整个派对离开(所有5个座位都变得空闲)才能坐下。

这必须使用Thread来强制执行。客户数量作为命令行参数传入。

不管怎么说,我都不知道该怎么做。

我在想-我是否应该使用提供的信号量类,是否应该创建两个类型为"CustomerThread“的队列,其中一个队列用于当前正在饮酒的顾客,另一个队列用于排队等候的顾客?或者,排队等候的应该是BlockedQueue?然而,我不确定如何执行5个座位的规则。例如,假设两个线程完成并离开商店,将有两个空座位,但在所有5个线程都打开之前,我们不能将接下来的5个添加到饮酒队列并从等待队列中删除。

EN

回答 1

Stack Overflow用户

发布于 2016-05-01 04:52:54

值得一看的是Conditions,它们比Semaphores更容易定制,如果你没有这样的要求(当店满时,我们需要等待商店完全空了),那么Semaphore会是最好的,我们创建一个有5个permitsSemaphore,当人们进入时我们await,当他们离开时我们release。但是有了这些限制,Condition可能是更好的选择。

差不多吧。

代码语言:javascript
复制
 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为您维护了一个等待线程队列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36959525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档