isStopped = true;
System.out.println("The clock has to be stopped");
что она делает?
ak
22 уровень
зачем переменная isStopped в методе мейн?
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Andrey PirogovExpert
15 июня 2020, 15:40
Было бы не плохо прикреплять код задачи, но если она реализована так же как у меня, то isStopped = true останавливает while цикл в ните clock
0
ak
15 июня 2020, 17:19
public static volatile boolean isStopped = false;
public static void main(String[] args) throws InterruptedException {
Clock clock = new Clock();
Thread.sleep(2000);
isStopped = true;
System.out.println("The clock has to be stopped");
Thread.sleep(2000);
System.out.println("Double-check");
}
public static class Clock extends Thread {
public Clock() {
setPriority(MAX_PRIORITY);
start();
}
0
ak
15 июня 2020, 17:24
public void run() {
try {
while (!isStopped) {
printTikTak();
}
} catch (InterruptedException e) {
}
}
private void printTikTak() throws InterruptedException {
//add your code here - добавь код тут
System.out.println("Tik");
Thread.sleep(500);
System.out.println("Tak");
Thread.sleep(500);
}
0
ak
15 июня 2020, 17:33
Clock clock = new Clock(); // запускается конструктор clock. В конструкторе запускается метод run(). В методе run выполняется поочередный вывод на экран текста. в сумме 2 раза. Далее выход из метода run.
Thread.sleep(2000); // засыпает на 2сек.
isStopped = true; // тут что?
System.out.println("The clock has to be stopped");
Thread.sleep(2000);
System.out.println("Double-check");
}
0
Andrey PirogovExpert
15 июня 2020, 18:55
При загрузке класса создается переменная isStopped = false, далее
1.Запускается метод mаin основной поток
2. Создаешь объект clock , который в конструкторе вызывает метод start и запускается второстепенный поток
3. Основной поток засыпает на 2 секунды, второстепенный поток работает запустив метод run(), в котором цикл while (!isStopped) вызывает метод printTikTak() (в этом методе второстепенный поток 2 раза засыпает на 500 мс).
4. Просыпается основной поток присваивает переменной isStopped = true
засыпает
5. В следующую итерация цикла while метода run значение isStopped уже true (тут есть некоторые нюансы, но они сейчас не столь важный) и значит второстепенный поток выйдет из цикла и метод run завершит работу
+4
Andrey PirogovExpert
16 июня 2020, 06:16
//как может заснуть первый на 2сек, если работает второй в это время? или после старта запустился главный поток и сразу уснул по команде на 2с
Спокойно, в этом и смысл потоков) если многоядерный компьютер то каждый поток работает на своем ядре, если все занято другими потоками, то поток просо ждет, главный поток можно было не усыплять, но тогда второстепенный просто не успел бы что то сделать
// в цикле while (!isStopped) переменная isStopped меняет свое булево значение на противоположное, т.е становится true.
Где оно меняет? выражение !isStopped не меняет значение у переменной, говорит что то типо: возьмем обратное значение от isStopped и загрузим его в while, так как изначально оно false, то в цикле оно становится true. Но тут проснулся основной поток поменял значение isStopped на true (тут он реально его поменял), а так как переменная статична, да еще и volatile , то оно одинаково для всех и когда второстепенный поток попробует взять обратное значение от isStopped, то получит falsе и поток завершится.
+4
ak
16 июня 2020, 07:12
спасибо большое! разобрался.
на счет переменной isStopped я погарячился, видимо на солнце перегрелся...))
0