Сгенерируйте новое случайное число, используя запланированный исполнитель, а затем передайте это число как новый временной интервал в Java - PullRequest
0 голосов
/ 28 мая 2020

Доброе утро,

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

public void start() {

    long delay = 5;

    final Runnable g = () -> {
            delay = (long)(50 * (Math.random()+0.1));
            thingDoer.doAwesomeThings();
    };
    final ScheduledFuture<?> passerbyGenerator = schedule.scheduleAtFixedRate(g, 1, delay, 
            TimeUnit.MILLISECONDS);
}

Я никогда не пытался сделать это без фиксированного интервала. Я знаю, что у меня выше не получится. Во-первых, последняя строка кода устанавливает расписание и выполняется только один раз. Во-вторых, похоже, что я не могу использовать изменяющуюся переменную внутри запланированного потока. Я получаю следующую ошибку: «Задержка локальной переменной, определенная во включающей области, должна быть окончательной или фактически окончательной».

Как я могу запустить поток, который делает то, что я хочу делать? Другими словами, как я могу настроить звуковой сигнал, который издает нерегулярные интервалы?

1 Ответ

0 голосов
/ 28 мая 2020
public class ThingDoer implements Runnable {

    private long delay;

    public ThingDoer(int initialDelay) {
        this.delay = initialDelay;
    }

    public static void main(String[] args) {

        new Thread(new ThingDoer(5)).start();

    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(delay);
                delay = (long) ((Math.random() + 0.1) * 50);

                doAwesomeThings();
                System.out.println(String.format("next delay: %s", delay));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void doAwesomeThings() {
        System.out.println("did something awesome");
    }

}

Фактический выход:

did something awesome
next delay: 31
did something awesome
next delay: 12
did something awesome
next delay: 48
did something awesome
next delay: 31
did something awesome
next delay: 44
did something awesome
next delay: 20
did something awesome
next delay: 26
did something awesome
next delay: 18
did something awesome
next delay: 39
did something awesome
next delay: 32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...