gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:32 25 4
gpt4 key购买 nike

我需要很多帮助。所以任务是模拟一家咖啡店。这是一家有5个座位的咖啡店。如果您到达时有空位,您可以立即入座。但如果你到达时 5 个座位​​都满了,那就意味着所有顾客都在喝咖啡一起,并且必须等待整个队伍离开(所有 5 个座位​​都空出)才能坐下。

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

无论如何,我不知道如何解决这个问题。

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

最佳答案

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

类似的事情。

 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为您维护了一个等待线程队列。

关于java - 使用队列和信号量模拟客户/员工线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com