Java ScheduledExecutorService выполняется быстрее, чем предполагалось

В настоящее время у меня возникают проблемы с выполнением ScheduledExecutorService быстрее заданного периода времени.

scheduleAtFixedRate указывает, что последующие выполнения могут быть поздними, но не ожидает заданное время после слов.

GrabPutTask просто берет информацию из источника, назначает время захвата и отправляет ее в базу данных. Поскольку интервал становится меньше секунды, запись в базе данных выдает ошибку в отношении повторяющейся записи.

Есть ли способ выполнить задачу в фиксированное время ПОСЛЕ завершения предыдущей задачи?

Я прочитал здесь что задачи "кучаются" в очередь, но решения для моих нужд не представлено.

private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

public static void main(String[] args)
{
    //
    ..
    //
    //Creating the looping thread.
    try
    {
        scheduler.scheduleAtFixedRate(new GrabPutTask(), (long) 1, (long) (seconds * 1000), TimeUnit.MILLISECONDS);
        LOGGER.info(String.format("DBUpdater connected and running. (GetAddr: %s, SetAddr: %s, Poll Rate: %.2f, Sector Number: %s, Number of PLCs: %d)",
                                  FROM_IP.split(":", 2)[0] + ":" + fromServer.getPort(), dataSource.getURL(), seconds, SECTOR, NUMBER_OF_PLCS_ON_MASTER));
    }
    catch (IllegalArgumentException ex)
    {
        LOGGER.log(Level.SEVERE, null, ex);
        printUsage();
        System.exit(1);
    }
}

Пример интервалов времени выполнения:

Event Called: 2014/02/12 14:19:07.199
Event Called: 2014/02/12 14:19:08.199
Event Called: 2014/02/12 14:19:09.199
Event Called: 2014/02/12 14:19:10.199
Event Called: 2014/02/12 14:19:11.199
Event Called: 2014/02/12 14:19:12.199
Event Called: 2014/02/12 14:19:13.199
Event Called: 2014/02/12 14:19:14.199
Event Called: 2014/02/12 14:19:15.199
Event Called: 2014/02/12 14:19:16.199
Event Called: 2014/02/12 14:19:17.199
Event Called: 2014/02/12 14:19:18.199
...
Event Called: 2014/02/12 14:20:21.415 (A load on the server it seems)
Event Called: 2014/02/12 14:20:22.215
Event Called: 2014/02/12 14:20:23.425
Event Called: 2014/02/12 14:20:24.422
Event Called: 2014/02/12 14:20:25.276
Event Called: 2014/02/12 14:20:25.997

person Seather    schedule 12.02.2014    source источник
comment
Вы видели метод scheduleWithFixedDelay сразу после этого?   -  person chrylis -cautiouslyoptimistic-    schedule 13.02.2014
comment
@chrylis Вы должны опубликовать это как ответ. Он гораздо менее громоздкий, чем мой Thread.sleep() ответ.   -  person Rainbolt    schedule 13.02.2014
comment
@John Непонятно, чего хочет ОП.   -  person chrylis -cautiouslyoptimistic-    schedule 13.02.2014
comment
@chrylis Извините за неясность. Это именно то, что я искал! Пожалуйста, напишите как ответ, и я + вам. Спасибо.   -  person Seather    schedule 13.02.2014


Ответы (2)


scheduleWithFixedRate пытается «наверстать упущенное», если выполнение по какой-либо причине задерживается. Вы можете использовать scheduleWithFixedDelay, чтобы система не запускала часы до завершения предыдущего выполнения; задержки будут накапливаться и не будут наверстывать упущенное.

person chrylis -cautiouslyoptimistic-    schedule 12.02.2014

Спать сколько угодно.

try {
    Thread.sleep(someTime);
} catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
}
person Rainbolt    schedule 12.02.2014