public class Solution {
public static volatile boolean isStopped = false;
public static void main(String[] args) throws InterruptedException {
Runner ivanov = new Runner("Ivanov", 4);
Runner petrov = new Runner("Petrov", 2);
//на старт!
//внимание!
//марш!
ivanov.start(); //запустили stopwatch.run
petrov.start(); //запустили stopwatch.run
Thread.sleep(2000); // 2 секунды main спит, run() stopwatch ничего не делает, тк isStopped = false
isStopped = true; // main проснулся, изменил значение isStopped run() stopwatcha вызывает dostep()
Thread.sleep(1000); //main спит cекунду
}
public static class Stopwatch extends Thread {
private Runner owner;
private int stepNumber;
public Stopwatch(Runner runner) {
this.owner = runner;
}
public void run() {
try {
while (!isStopped) {
doStep();
}
} catch (InterruptedException e) {
}
}
private void doStep() throws InterruptedException {
stepNumber++;
//add your code here - добавь код тут
if(this.owner.getSpeed()==4) {
Thread.sleep(250);
}
if(this.owner.getSpeed()==2) {
Thread.sleep(500);
}
System.out.println(owner.getName() + " делает шаг №" + stepNumber + "!");
}
}
public static class Runner {
Stopwatch stopwatch;
private String name;
private int speed;
public Runner(String name, int speed) {
this.name = name;
this.speed = speed;
this.stopwatch = new Stopwatch(this);
}
public String getName() {
return name;
}
public int getSpeed() {
return speed;
}
public void start() {
stopwatch.start();
}
}
}Dmitriy
23 уровень
Помогите разобраться, пожалуйста! почему цикл работает 2 секунды и потом останавливается? в какой строке эту указано?в комментах указал свое понимаение
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
11 ноября 2020, 12:59
Оборачивай код в соответствующие теги, чтобы читать можно было нормально, пожалей глаза остальных.
Это конечно математика высшего уровня.
А если не 2 и не 4, все числа придется перечислять в ифах? Напиши формулу-то.
0
Dmitriy
11 ноября 2020, 13:03
сперва не заметил, но потом сразу заметил что не обернутый!
математика что бы решение не выкладывать, задачу то я решил, не пойму то что указано в описание "Помогите разобраться и тд"
+1
hidden #598481
11 ноября 2020, 13:10решение
А, тебе на комменты ответить надо.
Все наоборот
Флаг isStopped переводится как "остановлен" и означает состояние, когда секундомер прекратил свою работу.
Соответственно, оба бегуна делают свои шаги, пока истинным является выражение !isStopped, то есть выражение, противоположное isStopped. Другими словами, цикл выполняется, пока isStopped == false. Спустя две секунды секундомер останавливается -> isStopped == true -> !isStopped == false -> run() в обоих секундомерах завершается.
Второй sleep в main не нужен, ты просто ожидаешь секунду перед завершением программы, все нити кроме main завершились.
+2
Dmitriy
11 ноября 2020, 13:34
те во второй строчке кода мы инициализировали переменную фолсем, в цикле while(!isStopped) условие дает тру тк переменная фолс?
0
hidden #598481
11 ноября 2020, 14:01
да, "!" - это оператор инверсии (not)
получается, т.к. isStopped == false, то !isStopped == true. То есть условие выполнено, и цикл выполняется.
0