作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试模拟银行的服务。到目前为止我可以随机生成随机时间的顾客,收银员如果不忙就会为他们服务。当模拟应该结束时我的问题就出现了……但它不会。不再产生顾客,但收银员仍在等待顾客。我尝试过不同的方法,但失败了。这是尝试不同解决方案之前的代码。
这是客户生成器:
@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 标志)则中断,或者传入一个特殊的空对象来告诉线程自行退出。
虽然可以像您一样使用 wait
和 notify
对此进行建模,但实现 producer-consumer 更简单使用 BlockingQueue
的工作流程。有你的生产者线程put
元素进入队列并具有消费者线程 take
从队列中。当没有更多元素要生成时,向队列添加一个特殊的空对象,作为消费者退出的信号,或者简单地中断线程。
关于java - 结束话题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50770213/
放弃当前在 Mercurial topic 中不需要的变更集的最佳方法是什么,这些变更集已经被推送并且不能被剥离? 换句话说,是否可以从 hg topics 输出中删除主题而不发布它? 最佳答案 hg
我是一名优秀的程序员,十分优秀!