Skip to content

LAB-1 Реализация задачи об обедающих программистах#1

Open
NobleBeer wants to merge 6 commits intoreview1from
master
Open

LAB-1 Реализация задачи об обедающих программистах#1
NobleBeer wants to merge 6 commits intoreview1from
master

Conversation

@NobleBeer
Copy link

No description provided.

@NobleBeer NobleBeer force-pushed the master branch 9 times, most recently from f3d4c51 to ddc67c8 Compare September 21, 2025 20:01
public class KitchenModel {

private final AtomicInteger remainingDishCount;
private final BlockingQueue<ServeRequest> requestQueue = new LinkedBlockingQueue<>();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вопрос без подвоха: почему именно BlockingQueue? Вопрос возможно с подвохом, но не факт: как у вас дела с условием, что все должны быть примерно одинаково накормлены?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BlockingQueue показалось изящным выходом из положения, в плане это очень похоже на настоящий стол заказов. Разработчик оставляет заявку, кухня кладет его в очередь, официант принимает его (см. run()). На самом деле я хочу так избежать работы с более низким уровнем абстракции, поэтому блокировка под капотом выглядела заманчиво.
Все разработчики одинаково накормлены, проблемы начинаются на маленьком числе блюд около 100, но на больших числах точность великолепна (см. приложение)
image

Copy link

@kechinvv kechinvv Sep 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можете ради практики посмотреть как оно работает на маленьком числе блюд и с очередью с приоритетом



public void putSpoons(int developerId, SpoonModel leftSpoon, SpoonModel rightSpoon) {
lock.lock();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Локи это конечно здорово, но у вас они на все тело метода и вроде без условий (и не только здесь). Не проще ли обойтись synchronized?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я боюсь synchronized

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему?

Copy link
Author

@NobleBeer NobleBeer Sep 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Потому что эта какая-то 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);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А сможете объяснить почему именно Fixed? Может есть варианты поинтереснее?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде бы можно использовать виртуальные потоки или newCachedThreadPool() подойдет, но в данным случае захардкоженность играет на руку и является обоснованием для фиксированного пула. Мы заранее знаем, сколько потоков требуется

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants