ВОТ МЕЙН ЗАДАЧИ:
public static void main(String[] args) throws InterruptedException {
Politician ivanov = new Politician("Иванов");
ivanov.join(); ----------------------------------------------------------------------------тут мы ждем пока иванов выговорит всевремя
Politician petrov = new Politician("Петров"); ------------------------------------------- запускается еще одна нить
Politician sidorov = new Politician("Сидоров");-----------------------------------------запускается еще одна нить
--------------------------------------------------------------------------------------------------------------на данный момент бегут 3 нити : мейна, петрова и сидорова
while (ivanov.getSpeechCount() + petrov.getSpeechCount() + sidorov.getSpeechCount() < totalSpeechCount) {
}-------------------------------------------------------------------------------------------------------этот цикл не вызывается, тк у петрова все getSpeechCount() уже 200. В это время 3 ОСТАЛЬНЫЕ НИТИ ЕЩЕ БЕГУТ, и сидоров с петровым толкают речи.
System.out.println(ivanov);
System.out.println(petrov);
System.out.println(sidorov);
-----------------------------------------------------------------------------------------------------------выводит след : 200 у иванова, 0 у сидорова и петрова... ПОЧЕМУ? эти же нити бегут пока сами не достигнут показателя 200. Если мейн вызвал метод println(...) раньш, чем они достигли 200, то должны быть выведены промежуточные результаты, но не НОЛЬ. ЛЮДИ ДОБРЫЕ, ШТА ЭТО И ПОЧЕМУ ТАК???
}
Dima
35 уровень
Ребят, почему сидоров и петров вообще ничего не сказали??
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Николай
10 февраля 2019, 15:37решение
utterancesPerSpeech = 1000000, так что просто не успевают.
Можно добавить Thread.sleep(100) (например, перед циклом в методе main) и увидеть, что Сидоров с Петровым тоже что-нибудь скажут)
Или вот так:
+4
Dima
12 февраля 2019, 14:24
Понял, большое спасибо!
0
Dima
12 февраля 2019, 17:08
нет, стоп, не понял.
Николай, скажите пожалуйста, при чем тут utterancesPerSpeech = 1000000?
вот тут они начали работать
Politician petrov = new Politician("Петров");
Politician sidorov = new Politician("Сидоров");
потом проверка условия (к этому момену они ведь уже долждны что то сказать были, разве нет??? ):
while (ivanov.getSpeechCount() + petrov.getSpeechCount() + sidorov.getSpeechCount() < totalSpeechCount) {
}
0
Николай
12 февраля 2019, 18:29решение
Для того, чтобы они что-то сказали, значение utteranceCount должно быть больше utterancesPerSpeech, так как
То, что мы их создали, не значит, что они сразу начали работать. И даже если начали, то для того чтобы метод getSpeechCount() вернул значение больше 0, необходимо, чтобы метод run() успел увеличить значение utteranceCount как минимум до 1000000 (значение utterancesPerSpeech).
К примеры, вот такой код
даёт вот такой вывод:
Иванов сказал речь 200 раз
700998
715063
Петров сказал речь 0 раз
Сидоров сказал речь 0 раз
+3
Dima
19 февраля 2019, 13:12
Спасибо за обьяснение!
0