Приветствую! Ситуация где застрял и не могу вычислить ошибку! По итогу если меньше 3.5 секунд работает корректно, если больше 3.5, оно отсчитывает по примеру: 4 3 2 1 и затем "Прервано" выводиться на экран бесконечное число раз и цикл не останавливается. В условии загнал while(numSeconds >= 0 && !current.isInterrupted()) и почему то цикл не выполняется, голову сломал не знаю в чем дело!
Задание: 1. Разберись, что делает программа.
2. Реализуй логику метода run так, чтобы каждую секунду через пробел
выдавался отсчет начиная с numSeconds до 1, а потом слово [Марш!] (см примеры).
3. Если нить работает 3.5 секунды или более, прерви ее методом interrupt и внутри нити выведи в консоль слово [Прервано!].
Пример для numSeconds=4 :
"4 3 2 1 Прервано!"
4. Если нить работает менее 3.5 секунд, она должна завершиться сама.
Пример для numSeconds=3 :
"3 2 1 Марш!"
PS: метод sleep выбрасывает InterruptedException.
Вот код:
public class Solution {
public static volatile int numSeconds = 4;
public static void main(String[] args) throws InterruptedException {
RacingClock clock = new RacingClock();
//add your code here - добавь код тут
//clock.start();
}
public static class RacingClock extends Thread {
public RacingClock() {
start();
}
public void run() {
//add your code here - добавь код тут
Thread current = Thread.currentThread();
double secLimit = 0;
while (numSeconds >= 0 && !current.isInterrupted()) {
try {
if (secLimit >= 3.5) {
System.out.print("Прервано!");
current.interrupt();
} else {
if (numSeconds == 0) {
System.out.print("Марш!");
} else {
System.out.print(numSeconds + " ");;
}
}
Thread.sleep(1000);
numSeconds--;
secLimit++;
} catch (InterruptedException e) {
}
}
}
}
}
И. Ж.
41 уровень
Бесконечный цикл при условии если срабатывает Interrupt() метод, то есть почему то некорректно срабатывает, не останавливает!
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Сергей
10 июля 2022, 15:13
И в main добавь Interrupted
0
Сергей
10 июля 2022, 13:59
ты почти все сделал правильно, вот мой код
0
И. Ж.
11 июля 2022, 18:32
В итоге разобрался. Оказался неожиданный момент. После того как я вызвал current.interrupt() внутри метода run в методе sleep срабатывает исключение и выбрасывает в catch. И я думал что после этого все прервется, поскольку isInterrupted будет true и цикл прервется. Но нет, оказывается когда выбрасывается исключение в методе sleep, isInterrupted возвращается обратно в false, проверил так и есть, поэтому соответственно цикл не прерывался. В итоге внутри catch добавил еще раз interrupt() и заработало. Паршивый ньюанс оказался. В любом случае благодарю за поддержку!
0
Сергей
10 июля 2022, 13:57
Помогло гугление нашел тему "уменьшение int каждую секунду" https://question-it.com/questions/170530/umenshenie-int-s-10-do-0-kazhduju-sekundu-v-java Но мое решение условно отличается от правильного решения.
0
Сергей Ильин президент
9 августа 2022, 14:15
тем, что он очень трудно читается? почему нельзя проще реализовывать, в этом ведь одна из главных задач программиста, или я ошибаюсь?
0
Сергей
16 августа 2022, 19:27
Так а в чем проблема? реализуй проще и выложи сюда код!
+1