public class Solution {
public static void main(String[] args) throws InterruptedException {
Counter counter1 = new Counter();
Counter counter2 = new Counter();
Counter counter3 = new Counter();
Counter counter4 = new Counter();
counter1.start();
counter1.join();
counter2.start();
counter2.join();
counter3.start();
counter3.join();
counter4.start();
counter4.join();
for (int i = 1; i <= 100; i++) {
if (values[i] != 1) {
System.out.println("Массив values содержит элементы неравные 1");
break;
}
}
}
public static Integer count = 0;
public static int[] values = new int[105];
static {
for (int i = 0; i < 105; i++) {
values[i] = 0;
}
}
public static void incrementCount() {
count++;
}
public static int getCount() {
return count;
}
public static class Counter extends Thread {
@Override
public void run() {
do {
synchronized (values) {
incrementCount();
values[getCount()]++;
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
} while (getCount() < 100);
}
}
}58 строчка, если 100 заменить на values.leght, то в цикле getCount() дает числа аж до 108, но почему если после того как он дает больше 105 (что есть длинна массива) то цикл завершается?ma
28 уровень
Почему стоит 100 а не values.leight?
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Samvel
22 января 2023, 16:25
ну да еще, мютекс и прочую нечесть надо тормозить, по значениям, иначе полный кикоз...
+1
Samvel
22 января 2023, 16:12полезный
Thread.currentThread.getName() + Arrays.toString(значения) - проше для понимания процесса...
+1
RaStudent
21 января 2023, 08:25решение
Не совсем понял вопрос.
У вас нити выполняются последовательно из-за join.
Первая нить доводит count до 105 и вылетает из-за исключения.
Все последующие увеличивают его на +1 и вылетают, не успев ничего сделать
+2
ma
22 января 2023, 05:22
до меня дошло, только после первой нити остальные не вылетают ничего не успев сделать т.к. цикл сначала делает виток, потом проверка, так что остальные нити увеличивают count еще на 1 и увеличивают значение values[count], то есть если первая нить увеличит count до 105, следующая нить увеличит count уже до 106 и увеличит values[106], но в массиве максимальный индекс 104, вот и кидает исключение...
0