ScheduledExecutorService не запускается правильно

Я пытаюсь запустить метод после задержки со следующим кодом:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new UpdateTDDBRejections(), 5, 10, TimeUnit.SECONDS);

Он должен дождаться прохождения задержки, вызвать метод «UpdateTDDBRejections», который находится в другом, Runnable, классе, который распечатает фразу, а затем заснет, а затем снова распечатает фразу и т. д. и т. д.

Он этого не делает, он просто печатает фразу и затем останавливается.

Однако, когда я настроил это так:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() 
{
      @Override
      public void run() {
        // do stuff
           System.out.println("garbage garbage garbage");
      }
    }, 5, 10, TimeUnit.SECONDS);

Он работает так, как и следовало ожидать от ScheduledExecutorService. У меня сложилось впечатление, что, поскольку я использую Java 8.4, мне не нужно будет добавлять TimerTask, чтобы сделать эту координату так, как я хочу. Какие-либо предложения? Или я просто не могу вызывать другие классы Runnable с помощью ScheduledExecutorService?

РЕДАКТИРОВАТЬ: это класс UpdateTDDBRejections.

public class UpdateTDDBRejections implements Runnable
{
   UpdateTDDBRejections()
   {
       System.out.println("garbage garbage garbage");
   }
   @Override
   public void run()
   {
   }
}

person senex_subconscious    schedule 08.05.2015    source источник
comment
Как выглядит реализация UpdateTDDBRejections?   -  person Tavian Barnes    schedule 08.05.2015
comment
@TavianBarnes добавил. Это не очень славно, я просто пытаюсь вызвать класс прямо сейчас, чтобы я мог заставить его работать, а затем к нему будет добавлено больше. Это доказательство концепции, чтобы показать, что я могу это сделать.   -  person senex_subconscious    schedule 08.05.2015
comment
Гм, вы должны перенести работу на метод run(), а не на конструктор. Конструктор запускается только один раз, когда вы делаете new UpdateTDDBRejections()   -  person Tavian Barnes    schedule 08.05.2015
comment
@TavianBarnes omfg спасибо! Я не думал! Ага, это было!   -  person senex_subconscious    schedule 08.05.2015
comment
Код неправильный, независимо от того, какую версию Java вы используете, поэтому я не вижу связи с Java 8. Далее, я не вижу, как здесь задействован «TimerTask».   -  person Holger    schedule 11.05.2015
comment
Оскорбительные теги @Holger удалены. Извинения.   -  person senex_subconscious    schedule 12.05.2015


Ответы (1)


Это метод run, который выполняется повторно. Попробуйте следующее:

public class UpdateTDDBRejections implements Runnable
{
   @Override
   public void run()
   {
       System.out.println("garbage garbage garbage");
   }
}

Обратите внимание, что, поскольку вы используете Java 8, вы можете сделать

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(() -> System.out.println("garbage garbage garbage"),
                         5, 10, TimeUnit.SECONDS);

Если вы хотите, чтобы конструктор запускался (возможно, это то, что вы пробовали с new UpdateTDDBRejections(), вам нужно сделать:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(UpdateTDDBRejections::new, 5, 10, TimeUnit.SECONDS);
                      // ^^^^^^^^^^^^^^^^^^^^^^^^^
person aioobe    schedule 08.05.2015
comment
Оооо! Великолепно! Да, это было ИМЕННО то, что я собирался! Благодарю вас! - person senex_subconscious; 08.05.2015
comment
Если бы я хотел передать переменные этому конструктору, как бы я его настроил? - person senex_subconscious; 08.05.2015
comment
ScheduleAtFixedRate принимает Runnable, а Runnable.run не принимает аргументов. Возможно, использовать Callable? - person aioobe; 08.05.2015
comment
Хм, у меня сложилось впечатление, что Runnable может принимать аргументы и просто ничего не возвращать? Я видел, как это было опубликовано в нескольких местах здесь, на SO... - person senex_subconscious; 08.05.2015
comment
Неа. Это функциональный интерфейс, и речь идет о методе public void run(), который явно не принимает аргументы. - person aioobe; 08.05.2015
comment
Давайте продолжим это обсуждение в чате. - person senex_subconscious; 08.05.2015