According to java docs-
A BlockingQueue does not intrinsically support any kind of "close" or "shutdown" operation to indicate that no more items will be added. The needs and usage of such features tend to be implementation-dependent. For example, a common tactic is for producers to insert special end-of-stream or poison objects, that are interpreted accordingly when taken by consumers.
You should interrupt the thread where it is blocked -
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 (InterruptedException ex) {
//... handle ...
}catch (Exception e) {
e.printStackTrace();
}
}
}