/*
Big Ben clock
*/
public class Solution {
public static volatile boolean isStopped = false;
public static void main(String[] args) throws InterruptedException {
Clock clock = new Clock("Лондон", 23, 59, 57);
Thread.sleep(4000);
isStopped = true;
Thread.sleep(1000);
}
public static class Clock extends Thread {
private String cityName;
private int hours;
private int minutes;
private int seconds;
public Clock(String cityName, int hours, int minutes, int seconds) {
this.cityName = cityName;
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
start();
}
public void run() {
try {
while (!isStopped) {
printTime();
}
} catch (InterruptedException e) {
}
}
private void printTime() throws InterruptedException {
//add your code here - добавь код тут
Thread.sleep(1000);
seconds++;
if(seconds==60){seconds=0;minutes++;}
if(minutes==60){minutes=0;hours++;}
if(hours==24){hours=0;}
if (hours==0&&minutes==0&&seconds==0) {
System.out.println(String.format("В г. %s сейчас полночь!", cityName));
}
else {
System.out.println(String.format("В г. %s сейчас %d:%d:%d!",
cityName, hours, minutes, seconds));
}
}
}
}
в общем решил задачу, но не понимаю, почему метод printTime() повторяет свою работу 4 раза! В главном методе main мы приостановили главный поток main на 4 секунды, пока не передадим true переменной isStoped. Значит ли это, что пока длится 4 секунды, метод run в классе Clock будет запускаться 4 раза ?Рустем
22 уровень
почему метод printTime() повторяет свою работу 4 раза...
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Вадим З.
15 февраля 2025, 13:20
я могу ошибаться, но по-моему, если мы подразумеваем в контексте работу со временем, код не должен пройти валидацию. Т.к. в конструкторе в параметрах мы имеем дело с int, легко можно передать в параметры, например, и этот код их обработает и не выдаст ошибку, хотя вывод будет не совсем корректный исходя из контекста
0
--------Master
26 января 2019, 10:20
А что делает метод run, пока main спит?
+2
Рустем
26 января 2019, 10:44
ну как я понимаю, создали объект сlock явно передав в него параметры(город, часы, минуты, секунды). В конструкторе класса Clock инициализировали переменные(передали значения аргументам через параметры в созданном объекте clock) и в конструкторе запустили второй поток clock, соответственно в это время пока поток clock выполняет свои действия основной поток main спит так как в методе main прописано Thread.sleep(4000), то есть спать он будет 4 секунды, только после этого в переменную isStoped будет передано значение true для остановки потока clock, после остановки потока clock будут выполнятся инструкции главного потока main, после опять Thread.sleep(1000) и основной поток завершит свою работу.
Если я неправильно расписал действия работы данной программы жестко не судите, да я учусь только, буду признателен любой критике, ибо в моём случае это сейчас очень важно и полезно!
А так мне не ясно, почему запуск метода printTime() происходит 4 раза, так как проверка условия происходит 4 раза и соответственно выводов в консоль у нас 4 раза происходит.
0
--------Master
26 января 2019, 10:46
Поправка: потоки - на то и потоки, что работают они одновременно, а не только по принципу "один спит - другой работает".
А так ты расписал все, кроме ответа на заданный наводящий вопрос: что делает поток clock в течение этих 4 секунд?
0
Рустем
26 января 2019, 10:48
наверное выполняет инструкции, которые прописаны в нём.
0
--------Master
26 января 2019, 10:52
А в чем заключаются эти инструкции?
0
Рустем
26 января 2019, 10:53
наверное в выполнении того кода, который прописан в методе run.
p.s чувствую себя студентом, который сдает экзамен, а ему препод задаёт наводящие вопросы, чтобы запутать меня xD
+1
--------Master
26 января 2019, 10:58
Я тебе эти вопросы задаю не чтобы запутать, а наоборот, чтобы ты уже наконец догадался заглянуть в этот самый метод run и разобраться, что же все же делает этот самый поток с момента запуска, а не анализировать все, кроме самой сути...
+1
Рустем
26 января 2019, 11:17
я похоже понял в чем дело. В методе run у нас идет обработка исключения и цикл пока переменная isStoped не будет true. Так как у нас в методе printTime() есть Thread.sleep(1000), то каждую секунду метод спит, а цикл в run повторяет работу метода printTime в течении 4 секунд.
Правильно мыслю то хоть ?
+1
--------Master
26 января 2019, 12:08решение
Да, цикл в run повторяет вызов метода printTime (метод работает около секунды), пока main не выставит в true флаг завершения работы, после этого цикл прекращается, нить завершает работу.
+5
Рустем
26 января 2019, 12:20
благодарю за поиск ответа :)
+1