Conversation
f3d4c51 to
ddc67c8
Compare
| public class KitchenModel { | ||
|
|
||
| private final AtomicInteger remainingDishCount; | ||
| private final BlockingQueue<ServeRequest> requestQueue = new LinkedBlockingQueue<>(); |
There was a problem hiding this comment.
Вопрос без подвоха: почему именно BlockingQueue? Вопрос возможно с подвохом, но не факт: как у вас дела с условием, что все должны быть примерно одинаково накормлены?
There was a problem hiding this comment.
BlockingQueue показалось изящным выходом из положения, в плане это очень похоже на настоящий стол заказов. Разработчик оставляет заявку, кухня кладет его в очередь, официант принимает его (см. run()). На самом деле я хочу так избежать работы с более низким уровнем абстракции, поэтому блокировка под капотом выглядела заманчиво.
Все разработчики одинаково накормлены, проблемы начинаются на маленьком числе блюд около 100, но на больших числах точность великолепна (см. приложение)

There was a problem hiding this comment.
Можете ради практики посмотреть как оно работает на маленьком числе блюд и с очередью с приоритетом
|
|
||
|
|
||
| public void putSpoons(int developerId, SpoonModel leftSpoon, SpoonModel rightSpoon) { | ||
| lock.lock(); |
There was a problem hiding this comment.
Локи это конечно здорово, но у вас они на все тело метода и вроде без условий (и не только здесь). Не проще ли обойтись synchronized?
There was a problem hiding this comment.
Потому что эта какая-то deep многопоточка. Не могу отделаться от чувства, что есть варианты, требующие меньше контроля и внимания. Например lock)
| private static final int DISH_COUNT = Config.DISH_COUNT; | ||
| private static final int WAITER_COUNT = Config.WAITER_COUNT; | ||
|
|
||
| private final ExecutorService developerPool = Executors.newFixedThreadPool(TARGET_RESOURCE_COUNT); |
There was a problem hiding this comment.
А сможете объяснить почему именно Fixed? Может есть варианты поинтереснее?
There was a problem hiding this comment.
Вроде бы можно использовать виртуальные потоки или newCachedThreadPool() подойдет, но в данным случае захардкоженность играет на руку и является обоснованием для фиксированного пула. Мы заранее знаем, сколько потоков требуется
No description provided.