Suppose I have BlockingQueue and some of the threads are called take() but the queue is empty at the moment. And suppose I somehow know that in the future new elements will not appear in the queue. How can I release those threads that are called take() from waiting? Thanks!
public void run() {
//noinspection InfiniteLoopStatement
while (true) {
try {
Thread.sleep(millisecondsToSleep);
if (!kitchen.processedOrdersEmpty()) {
Order processedOrder = kitchen.getFromProcessedOrders();
kitchen.printMessage("took order#" + processedOrder.getOrderNumber());
Thread.sleep(millisecondsToServe);
kitchen.printMessage("served order#" + processedOrder.getOrderNumber());
} else {
int currentRandom = getNextRandom();
if (currentRandom <= 10) {
Order newOrder = new Order(kitchen.getLastOrderNumber());
kitchen.puIntoUnprocessedOrders(newOrder);
kitchen.printMessage("generated new order#" + newOrder.getOrderNumber());
} else {
Thread.sleep(millisecondsToSleep);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
where kitchen.getFromProcessedOrders() equals:
public Order getFromProcessedOrders() throws InterruptedException {
return processedOrders.take();
}
and processedOrders is a BlockingQueue