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

时间:2016-04-30 19:53:55

标签: java queue semaphore thread-synchronization

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

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

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

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

1 个答案:

答案 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}' 为您维护一个等待的线程队列。