Войти Регистрация
Конкурентность

18. Очередь сборки заказов на wait и notify

Сложная

Java · 38 строк

На складе 4 потока приёма кладут заказы в очередь на сборку, 40 терминалов сборщиков их забирают. Очередь ограничена 500 заказами, табло показывает её размер.

Отметьте строки с ошибками.

В работе: Распределение заказов по сборщикам на складе.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
wait/notifyspurious wakeupnotifyAllограниченная очередь

Источник: на задачах Wildberries: сборка заказов на складе. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import java.util.ArrayDeque;
  2. import java.util.Deque;
  3. // Очередь заказов на сборку: 4 потока приёма кладут, 40 терминалов сборщиков забирают.
  4. public class PickQueue {
  5. private final Deque<Long> orders = new ArrayDeque<>();
  6. private final int capacity;
  7. public PickQueue(int capacity) {
  8. this.capacity = capacity;
  9. }
  10. public void put(long orderId) throws InterruptedException {
  11. synchronized (this) {
  12. if (orders.size() == capacity) {
  13. wait();
  14. }
  15. orders.addLast(orderId);
  16. notify();
  17. }
  18. }
  19. public long take() throws InterruptedException {
  20. synchronized (this) {
  21. if (orders.isEmpty()) {
  22. wait();
  23. }
  24. long id = orders.removeFirst();
  25. notify();
  26. return id;
  27. }
  28. }
  29. // Размер очереди для табло на складе.
  30. public int size() {
  31. return orders.size();
  32. }
  33. }