Conversation
| // Running 10 iterations | ||
| for (int i = 0; i < 10; i++) { | ||
| // Generating random nums | ||
| int programmersCount = rand.nextInt(MAX); |
There was a problem hiding this comment.
Предлагаю сделать конфиг не рандомом и не хардкодом, чтобы можно было легко менять без рекомпила
There was a problem hiding this comment.
Исправил, теперь значения лежат в конфиге
| @Override | ||
| public void run() { | ||
| try { | ||
| while (true) { |
There was a problem hiding this comment.
Кажется можно переписать так, чтобы не торчало while true
There was a problem hiding this comment.
Исправил, теперь цикл выглядит так:
@Override
public void run() {
try {
// Trying to eat while food is here
while (!forks.isEmpty() && takeOnePortionIfAvailable()) {
boolean ate = false;
// Trying while the programmer eat
while (!ate) {
// If grabbed forks - eat
if (grabForks()) {
try {
EatDinnder();
ate = true;
} finally {
ReleaseForks();
}
} else {
Thread.sleep(50);
}
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
```
| import java.util.concurrent.atomic.AtomicInteger; | ||
| import java.util.concurrent.ConcurrentHashMap; | ||
|
|
||
| public class Programmer extends Thread { |
There was a problem hiding this comment.
Как будто делать все это на голых тредах плохая идея, столько всяких штук на лекции и практики рассмотрели...
There was a problem hiding this comment.
Как у вас обеспечивается равномерность поедания? В текущей реализации кажется, что чем шире будет диапазон рандома времени поедания, тем больше будет разброс накормленности
There was a problem hiding this comment.
Но по крайней мере это получилось. Да с равномерностью были в некоторых случаях проблемы,
проанализировав пришел к двум выводам:
- Нужно использовать лок вместо синхронайза
- Не забирать из хэшмапа вилки
- Убрать из EatDinnder sleep с рандомным шумом
После этого результаты стали такие:
П - Программисты, ПЕ - порций еды
50П, 150ПЕ:
--------------------------------------------------------------------
Programmers: 50
Food: 150
Dinner is over!
Food amount is 0
Portions eaten: 1, Count: 3
Portions eaten: 2, Count: 12
Portions eaten: 3, Count: 23
Portions eaten: 4, Count: 7
Portions eaten: 5, Count: 4
Portions eaten: 6, Count: 1
-----------------------------
50П, 100ПЕ:
--------------------------------------------------------------------
Programmers: 50
Food: 100
Dinner is over!
Food amount is 0
Portions eaten: 1, Count: 9
Portions eaten: 2, Count: 32
Portions eaten: 3, Count: 9
--------------------------------------------------------------------
50П, 50ПЕ:
--------------------------------------------------------------------
Programmers: 50
Food: 50
Dinner is over!
Food amount is 0
Portions eaten: 1, Count: 50
--------------------------------------------------------------------
There was a problem hiding this comment.
50П 750ПЕ
--------------------------------------------------------------------
Programmers: 50
Food: 750
Dinner is over!
Food amount is 0
Portions eaten: 8, Count: 1
Portions eaten: 11, Count: 1
Portions eaten: 12, Count: 7
Portions eaten: 13, Count: 9
Portions eaten: 14, Count: 10
Portions eaten: 15, Count: 7
Portions eaten: 16, Count: 6
Portions eaten: 17, Count: 2
Portions eaten: 18, Count: 2
Portions eaten: 19, Count: 1
Portions eaten: 21, Count: 2
Portions eaten: 28, Count: 1
Portions eaten: 30, Count: 1
There was a problem hiding this comment.
Получается что при небольших значениях, все едят одинаково,
При огромных значениях большинство есть одинаково, аномальные выбросы есть, но они единичны
Все остаются сытыми
| while (!ate) { | ||
| // If successfully grabbed forks | ||
| // - eat | ||
| if (grabForks(this.forks)) { |
There was a problem hiding this comment.
Какой то страшный каскад всего подряд, еще и вложенные циклы. Постарайтесь пж отрефакторить, чтобы выглядело поаккуратнее
|
Внес все правки о которых вы говорили, так же добавил семафор. Получился намного меньше разброс |
No description provided.