Как заставить код запускаться один раз внутри цикла фоновой задачи?

У меня цикл фоновой задачи выглядит так:

Timeline fiveSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(1), event -> {
     if (hourNow >= cashCutOff_Start && hourNow <= cashCutOff_End - 1) {
//Run the code once
}
}));
fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);
fiveSecondsWonder.play();

Этот код делает цикл каждую секунду. Но я хочу сделать одну строку кода исполняемой после запуска этого кода.

Либо создайте 2 отдельных Timeline, либо используйте логическую переменную для проверки внутри, чтобы узнать, выполнялась ли уже эта часть кода.

Kaddath 06.03.2019 11:00

Не имеет отношения к вашей проблеме: пожалуйста, изучите соглашения об именах Java и придерживайтесь их. Связано: довольно неясно, что вам нужно - пожалуйста, предоставьте минимальный воспроизводимый пример, который демонстрирует проблему и то, как она не соответствует вашим требованиям.

kleopatra 06.03.2019 11:07

@kleopatra, где он не следует соглашениям об именах?

Stultuske 06.03.2019 11:09

подчеркивания должны быть в верблюжьем регистре

kleopatra 06.03.2019 11:11

подчеркивания - не самое красивое зрелище, но они разрешены (согласно интерпретации соглашений Oracle имеет oracle.com/technetwork/java/codeconventions-135099.html )

Stultuske 06.03.2019 11:27

хе-хе, это имя переменной выглядит знакомо: stackoverflow.com/questions/9966136/… :D

Sergey Grinev 06.03.2019 12:07

хахахаха правда

John Smith 06.03.2019 12:48

@Stultuske не видит в этом документе никаких утверждений, предлагающих использовать символы подчеркивания (за исключением констант, которые написаны заглавными буквами, поэтому у них нет других средств для разделения слов) ... очевидно, что они разрешены языком (иначе компилятор будет жаловаться) но нарушая соглашения об именах... повторяя, чтобы довести дело до конца <g>

kleopatra 12.03.2019 11:08

@kleopatra во всех рекомендациях говорится, что имена переменных не должны НАЧАТЬ с символа подчеркивания: «Имена переменных не должны начинаться с символов подчеркивания _ или знака доллара $, даже если оба они разрешены». Проблема с подобными предложениями в руководствах заключается в том, что они немного двусмысленны и открыты для интерпретации.

Stultuske 12.03.2019 11:10

@Stultuske нет ничего открытого - они четко указывают, что вы должны сделать для разделения слов, и это верблюжий случай, ничего больше. По соглашению мы должны следовать утвердительным предложениям в соглашениях :)

kleopatra 12.03.2019 11:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Простое решение в два шага.

Создайте логическую переменную:

private boolean hasRun = false;

Добавьте оператор if на временную шкалу:

Timeline fiveSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(1), event -> {
    //check if code has run before
    if (!hasRun){
        //this will run only once
        //by setting hasRun = true;
        hasRun=true;
        //add your code here...
    }
    //this code will run in every KeyFrame
    //add your code here...
    }));
    fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);
    fiveSecondsWonder.play();

Просто удалите fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);

Другие вопросы по теме