Conversation
|
Попробуйте пж замерить разницу между вашим подходом к очереди и очереди с приоритетом |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Диаграмма взаимодействия между объектами
sequenceDiagram autonumber %% Участники participant P as Programmer (Thread) participant F as FairnessStrategy participant D as DeadlockStrategy participant L as Left Spoon (ReentrantLock) participant R as Right Spoon (ReentrantLock) participant Q as BlockingQueue<RefillRequest> participant W as Waiter (Thread) participant S as FoodStock participant M as SimulationStats %% Долив порции (запрос → обработка → результат) P->>Q: Поместить запрос на еду (RefillRequest) Note right of Q: Producer/Consumer<br/>межпоточная передача W->>Q: Забрать запрос Q-->>W: Передать RefillRequest официанту W->>S: Списать одну порцию со склада (если остались) S-->>W: Успех / Пусто Note over W,P: Ответ возвращается через<br/>завершение CompletableFuture W-->>P: Сообщить результат пополнения (успешно / еды нет) alt Еды больше нет и тарелка пуста Note over P: Условия завершения выполнены P-->>P: Завершить работу else Есть локальная порция loop Цикл приёма пищи %% Предварительный допуск по справедливости P->>F: Можно ли начинать есть сейчас? F-->>P: Да / Нет alt Нет P->>P: Небольшая пауза → вернуться к размышлению else Да %% Войти в "ворота" против дедлока P->>D: Войти в зону захвата двух ложек D-->>P: Вход разрешён %% Захват ложек (сначала меньший id) P->>L: Попытаться захватить первую ложку alt Ложка получена P->>R: Попытаться захватить вторую ложку alt Вторая получена %% Повторная проверка справедливости перед едой P->>F: Подтвердить возможность поесть F-->>P: Да / Нет alt Нет Note over P: Освободить обе ложки и отступить else Да P->>F: onStartEat(id) P->>P: Съесть одну порцию P->>M: Зарегистрировать съеденную порцию P->>F: onFinishEat(id) end else Таймаут на второй Note over P,L: Освободить первую ложку и откатиться end P->>R: Освободить вторую ложку else Таймаут на первой P->>P: Небольшая пауза → вернуться к размышлению end P->>L: Освободить первую ложку P->>D: Покинуть зону захвата end %% Проверка завершения цикла alt Склад пуст и локальной порции больше нет P-->>P: Выйти из цикла и завершиться else Иначе P-->>P: Вернуться к запросу end end endОписание действий
Диаграмма состояний программиста
stateDiagram-v2 [*] --> THINKING THINKING --> REQUESTING_REFILL : тарелка пуста REQUESTING_REFILL --> WAITING_REFILL : put(request) WAITING_REFILL --> WAITING_SPOONS : granted (hasPortion=true) WAITING_REFILL --> DONE : denied && !hasPortion && stock.depleted WAITING_SPOONS --> THINKING : tryLock timeout (любая ложка) WAITING_SPOONS --> THINKING : fairness denied WAITING_SPOONS --> EATING : обе ложки взяты & fairness ok EATING --> THINKING : consume exactly 1 portion (hasPortion=false) THINKING --> DONE : stock.depleted && !hasPortion DONE --> [*]