Задачу решил, однако все её делают чуть по другому
Вот мой код.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
Считаем секунды
*/
public class Solution {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(in);
//create and run thread
Stopwatch stopwatch = new Stopwatch();
stopwatch.start();
//read a string
reader.readLine();
stopwatch.interrupt();
//close streams
reader.close();
in.close();
}
public static class Stopwatch extends Thread {
private int seconds;
public void run() {
try {
Thread current = Thread.currentThread();
while (!current.isInterrupted()) {
seconds++;
Thread.sleep(1000);
}
} catch (InterruptedException e) {
}
System.out.println(seconds);
}
}
}
У меня вывод в консоль идёт после блока try-catch. Валидатор,естественно, принял ответ.
Всё, в том числе и "правильное решение " делают вывод в консоль в блоке catch. Логика понятна- interrupt () ставит флаг треда на true , выбрасывается исключение , в обработке исключения печатается количество секунд.
А если interrupt() сработает в то короткое время, когда нить проснулась ? Флаг будет изменён на True и цикл while закончит работу, блок catch не отработает. Это я так думаю. Поясните, пожалуйста, в чем я заблуждаюсь.
Рустам
17 уровень
Задачу решил, вопрос появился
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Макс
2 августа 2021, 08:57
Знал бы я что это такое хD
0
Рустам
1 августа 2021, 14:38
Thread.currentThread() не использовать? А как еще можно то?
Ксения, обычно ваши ответы наталкивают на правильный путь, но сейчас вопросов меньше не стало
0
Ksenia Volkova Java Developer в DXC Master
1 августа 2021, 16:23
Ты пытаешься в методе run() получить тот объект Thread, у которого вызван этот run().
Но метод run() - это нестатический метод, а значит он по определению имеет в себе ссылку на тот объект, у которого он вызван - this.
Поэтому while(!this.isInterrupted()),
или просто while(!isInterrupted())
+4
Рустам
2 августа 2021, 06:55
Испытал когнитивный диссонанс , ибо в лекциях , комментариях и задачах используется Thread.currentThread() . Проверил в IDEA,убедился в Вашей правоте, подумал головой(!), осознал/запомнил. Спасибо.
Натолкните, пожалуйста , почему корректней делать вывод после catch, а не после завершения цикла while.
0
Ksenia Volkova Java Developer в DXC Master
2 августа 2021, 08:20
Можно и внутри try написать, конечно. Но команда System.out.println() в любом случае не может кинуть InterruptedException - поэтому никакой необходимости быть внутри try у нее нет.
0
Ksenia Volkova Java Developer в DXC Master
1 августа 2021, 06:42
Да, корректней делать вывод после catch.
А еще правильно будет не использовать тут Thread.currentThread()
+3