public class Solution {
public static volatile int countSeconds = 3;
public static void main(String[] args) throws InterruptedException {
RacingClock clock = new RacingClock();
Thread.sleep(3500);
clock.interrupt();
}
public static class RacingClock extends Thread {
public RacingClock() {
start();
}
public void run() {
try {
while (!currentThread().isInterrupted()) {
if (countSeconds == 0) {
System.out.println("Марш!");
currentThread().interrupt();
}
else {
System.out.print(countSeconds + " ");
Thread.sleep(1000);
countSeconds--;
}
}
}
catch (InterruptedException e) {
System.out.println("Прервано!");
}
}
}
}
Решил задачу случайно, после того как дописал sout в блок catch. Путем тестов, выяснил что разница между "Марш" и "Прервано " появляется в зависимости от того, в какое значение устанавливать thread.sleep в главном потоке.
Правильно ли я понимаю, что когда значение (3500), второй поток не успевает отработать до выполнения условия (countSeconds == 0). Вместо него просыпается главный поток и делает clock.interrupt, чем вызывает исключение в блоке try-catch, который впоследствии выкидывает "Прервано" ?Grigory Vladimirovich
23 уровень
Вопрос по блоку try-catch
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас Пасинков Software Developer в Zipy Master
22 июня 2018, 01:22решение
да, все верно.
единственное что могу уточнить, что исключение появится только когда поток будет "спать" или зайдет в метод слип. ведь только этот метод кидает такое исключение. если в момент когда нить прервали поток будет находиться где-нибудь на проверке условия в ифе и пойдет по первой ветви - то исключение может и не возникнуть.
но поскольку код выполняется за доли секунды, а все остальное время "выполняется" метод слип - то и подловить такой момент будет довольно трудно :) у меня пока не получалось ни разу когда намерянно делал. только случайно (и я по не знанию думал что это какой-то баг)
+3
Grigory Vladimirovich
27 июня 2018, 11:24
Спасибо,
единственное, если исключение появляется когда поток заходит в слип, или спит, почему сразу не отрабатывается блок catch и счетчик секунд не прерывается выводом "Прервано"?
0
Стас Пасинков Software Developer в Zipy Master
27 июня 2018, 19:18полезный
хм. ну в принципе, именно так и должно было работать :)
а почему считаешь, что не так работает?
когда main поток проснулся перед тем, как таймер досчитал до конца - main поток остановит таймер (точнее, пошлет ему "просьбу" остановиться).
то-есть, пока поток-таймер не заходит в метод слип - то и исключения не возникает. потому что InterruptedException кидает в вашем только метод sleep().
ну или я не понял вопроса :)
+2