Conversation
|
выполнил Лысенко Артём Константинович |
|
|
||
| @Getter | ||
| public class QueueService { | ||
| private final ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>(); |
There was a problem hiding this comment.
ConcurrentLinkedQueue это здорово, а как у вас дела с тем, что все +- одинаково поели?
There was a problem hiding this comment.
Обсуждали в личке тг, но для истории продублирую - 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)); |
There was a problem hiding this comment.
Хорошо, что взяли экзекуторы, но сможете объяснить, почему именно Fixed? Может есть варианты получше? Если есть, то почему (и если нет, то тот же вопрос)?
There was a problem hiding this comment.
Число потоков (программистов) заранее известно из конфига и жить эти потоки должны на протяжении всей программы, что и делает метод 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"; |
There was a problem hiding this comment.
Довольно странно делать конфиг через статики -- один мисклик и все рухнет, мб лучше сделать как нибудь иначе?
There was a problem hiding this comment.
Поправил на использование специального enum - org.labs.configuration.ConfigurationParam.
No description provided.