gpt4 book ai didi

java - 结束话题

转载 作者:行者123 更新时间:2023-12-02 02:06:11 26 4
gpt4 key购买 nike

我正在尝试模拟银行的服务。到目前为止我可以随机生成随机时间的顾客,收银员如果不忙就会为他们服务。当模拟应该结束时我的问题就出现了……但它不会。不再产生顾客,但收银员仍在等待顾客。我尝试过不同的方法,但失败了。这是尝试不同解决方案之前的代码。

这是客户生成器:

    @Override
public void run() {
while (currentTime != openTime) {
double accept = Math.random();
if (accept >= 0.6) {
addCustomerToQueue();
System.out.println("Customer in line.");
} else {
System.out.println("Waiting for a customer.");
}
try {
currentTime += 1000;
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}

private synchronized void addCustomerToQueue() {
Customer customer = new Customer(placeInLine + 1);
this.customerLinkedList.add(customer);
placeInLine++;
notify();
}

synchronized Customer getNextCustomer() throws InterruptedException {
notify();
while (customerLinkedList.size() == 0) {
wait();
}
return customerLinkedList.poll();
}

这是收银员:

    @Override
public void run() {
try {
while (true) {
Customer customer = generator.getNextCustomer();
int customerServingNumber = customer.getServingNumber();
double customerServingTime = customer.getServingTime();
System.out.println(cashierName + " serving " + customerServingNumber + " for " + getServingTime(customerServingTime));
Thread.sleep(customerServingNumber * 1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

最佳答案

Cashier 线程仅在被中断后终止(在直接调用 Thread.interrupt 或通过其他函数(如 ExecutorService.shutdownNow )调用之后发生)。您必须安排线程被中断,如果设置了某个条件(例如 boolean 标志)则中断,或者传入一个特殊的空对象来告诉线程自行退出。

虽然可以像您一样使用 waitnotify 对此进行建模,但实现 producer-consumer 更简单使用 BlockingQueue 的工作流程。有你的生产者线程put元素进入队列并具有消费者线程 take从队列中。当没有更多元素要生成时,向队列添加一个特殊的空对象,作为消费者退出的信号,或者简单地中断线程。

关于java - 结束话题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50770213/

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