Валидатор принял задачу, но мне не понятен один момент:
public void run() {
try {
//add your code here - добавьте код тут
while (!this.isInterrupted()){
seconds++;
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(seconds);
return;
}
}
Верно ли я понимаю:
1. Главная нить создает дочернюю и дальше они идут "в параллель".
2. В момент, когда главная вызывает interrupt, дочерняя может уже успеть пройти очередную проверку while и при вызове sleep сгенерируется исключение.
3. Но что, если при вызове interrupt главным потоком, дочерний поток как раз успеет на проверку while и тогда цикл завершится без вызова sleep и println не будет вызван?
Если мои доводы верны, тогда мне кажется верным сделать цикл while(true) , а не while (!this.isInterrupted()).
Подскажите плз, верно ли я все понимаю, если да, почему валидатор принял с while (!this.isInterrupted()) или меня вообще не в ту степь понесло?
Елена
35 уровень
Объясните логику плз
Обсуждается
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Лена Зелёная
29 марта 2020, 20:04
Вот на самом деле тоже немного не понятна эта часть лекции.
Более того, в методе sleep, который так любят использовать для организации вечного цикла в методе run, есть автоматическая проверка переменной isInterrupt. Если нить вызовет метод sleep, то этот метод сначала проверит, а не установлена ли для текущей (вызвавшей его нити) переменная isInterrupt в true. И если установлена, то метод не будет спать, а выкинет исключение InterruptedException.
в коде, который в блоке try-catch sleep не выкидывает ошибку, хотя isInterrupted == true.
Нипанятна.
0