Skip to content

a.k.lysenko solution#3

Open
kalin11 wants to merge 9 commits intoreview1from
a.k.lysenko-solution
Open

a.k.lysenko solution#3
kalin11 wants to merge 9 commits intoreview1from
a.k.lysenko-solution

Conversation

@kalin11
Copy link

@kalin11 kalin11 commented Sep 22, 2025

No description provided.

@kalin11
Copy link
Author

kalin11 commented Sep 22, 2025

выполнил Лысенко Артём Константинович

@kalin11 kalin11 changed the base branch from master to review1 September 22, 2025 15:30

@Getter
public class QueueService {
private final ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();

Choose a reason for hiding this comment

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

ConcurrentLinkedQueue это здорово, а как у вас дела с тем, что все +- одинаково поели?

Copy link
Author

Choose a reason for hiding this comment

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

Обсуждали в личке тг, но для истории продублирую - Fairness потоков достигается, тестил на 100 потоках, все примерно одинаковое количество раз запустились.
Вот параметры:

programmers_count=100
eat_count=10000
waiters_count=100
timeout_ms=10

Вот лог:

19:02:51.751 [main] INFO org.labs.Main -- Симуляция завершена. Сколько поел каждый:
19:02:51.752 [main] INFO org.labs.Main -- Программист 1 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 2 поел 102 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 3 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 4 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 5 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 6 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 7 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 8 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 9 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 10 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 11 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 12 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 13 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 14 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 15 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 16 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 17 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 18 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 19 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 20 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 21 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 22 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 23 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 24 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 25 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 26 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 27 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 28 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 29 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 30 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 31 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 32 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 33 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 34 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 35 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 36 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 37 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 38 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 39 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 40 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 41 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 42 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 43 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 44 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 45 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 46 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 47 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 48 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 49 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 50 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 51 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 52 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 53 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 54 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 55 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 56 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 57 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 58 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 59 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 60 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 61 поел 101 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 62 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 63 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 64 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 65 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 66 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 67 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 68 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 69 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 70 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 71 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 72 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 73 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 74 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 75 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 76 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 77 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 78 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 79 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 80 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 81 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 82 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 83 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 84 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 85 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 86 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 87 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 88 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 89 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 90 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 91 поел 98 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 92 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 93 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 94 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 95 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 96 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 97 поел 99 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 98 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 99 поел 100 раз
19:02:51.752 [main] INFO org.labs.Main -- Программист 100 поел 99 раз

Тестил на других коллекциях, по типу PriorityQueue - там уже Fairness отсутствует, так как нет принципа FIFO. В ней у нас выставляется приоритет в зависимости от компаратора - то есть там один поток будет обделять другие из-за наибольшего приоритета.

var foodService = new FoodService(eatCount);

var waiters = Executors.newFixedThreadPool(params.get(WAITERS_COUNT));
var programmers = Executors.newFixedThreadPool(params.get(PROGRAMMERS_COUNT));
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.

Хорошо, что взяли экзекуторы, но сможете объяснить, почему именно Fixed? Может есть варианты получше? Если есть, то почему (и если нет, то тот же вопрос)?

Copy link
Author

Choose a reason for hiding this comment

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

Число потоков (программистов) заранее известно из конфига и жить эти потоки должны на протяжении всей программы, что и делает метод newFixedThreadPool

Выписка из доки:

Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue.

Другие реализации будто бы не подходят для данной задачи. Например, cachedThreadPool более применим к короткоживущим асинхронным задачам, это не подходит под описание задачи. ScheduledThreadPool тоже не подходит, так как у нас тут нет какого-то расписания выполнения.

public static final String PROGRAMMERS_COUNT = "programmers_count";
public static final String EAT_COUNT = "eat_count";
public static final String WAITERS_COUNT = "waiters_count";
public static final String TIMEOUT_MS = "timeout_ms";

Choose a reason for hiding this comment

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

Довольно странно делать конфиг через статики -- один мисклик и все рухнет, мб лучше сделать как нибудь иначе?

Copy link
Author

Choose a reason for hiding this comment

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

Поправил на использование специального enum - org.labs.configuration.ConfigurationParam.

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

Comments