Задержка java.util.Timer еще на x секунд - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь запустить java.util.Timer каждые три секунды, и мне нужно отложить его еще на 2 при определенном условии. Чтобы проверить, можно ли это сделать, используя Thread.sleep(), я написал код ниже.

Timer t = new Timer();

t.schedule(new TimerTask() {
    @Override
    public void run() {
        if (true) { //When this is false timer should continue at 3 second interval.
            try {
                Thread.currentThread().sleep(2000); //Delay by another 2 seconds.
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        System.out.println(new Date());
    }
}, 0, 3000); //Trigger every 3 seconds.

Я ожидаю печати меток времени с разницей в 5 секунд. Но я получаю это с разницей в 3 секунды.

Tue Sep 18 15:08:17 IST 2018
Tue Sep 18 15:08:20 IST 2018
Tue Sep 18 15:08:23 IST 2018
Tue Sep 18 15:08:26 IST 2018
Tue Sep 18 15:08:29 IST 2018

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Ваш текущий код просто задерживает печать даты на 2 секунды. Это все еще будет с интервалом в 3 секунды.

Например: с датой начала x:

Без Thread.sleep вы будете печатать по адресу:

x, x + 3, x + 6, x + 9

С Thread.sleep вы будете печатать по адресу:

x + 2, x + 3 + 2, x + 6 + 2, x + 9 + 2

, что равно:

x + 2, x + 5, x + 8, x + 11 etc

Таким образом, между каждым отпечатком все еще есть задержка в 3 секунды.

См. Документацию по https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html

Каждый объект Timer соответствует одному фоновому потоку, который используется для последовательного выполнения всех задач таймера. Таймер задач должно завершиться быстро. Если задача таймера занимает слишком много времени для завершено, это "захватывает" поток выполнения задачи таймера. Это может, в включите, отложите выполнение последующих задач, которые могут «сгруппироваться» и выполнить в быстрой последовательности, когда (и если) оскорбительное задание наконец завершается.

Один и тот же поток будет использоваться для обработки каждого выполнения вашей задачи таймера. Когда задача выполняется, и она не завершается вовремя, пока таймер не запустит следующее выполнение задачи, следующее выполнение будет отложено до завершения предыдущего выполнения. Поведение аналогично ScheduledThreadPoolExecutor с размером пула потоков 1.

0 голосов
/ 18 сентября 2018

Ваш 2-секундный сон имитирует только 2 секунды работы в пределах 3-секундного интервала между срабатыванием TimerTask.Так что примерно через 1 секунду после сна ваш таймер снова включится.

Попробуйте вместо этого сделать сон в течение 5 секунд.

Однако помните, что задержка в этом случае не очень стабильна.Таймер рассмотрит все задачи, стоящие за графиком, и запустит их последовательно, как только завершится предыдущая.Может быть, лучше отменить задачи и перенести их на 5 секунд, если вы действительно этого хотите.

...