2015-05-08 7 views
2

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

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

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

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

Однако, когда я поставил его так:

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?

EDIT: Это класс UpdateTDDBRejections.

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

Что делает реализацию 'UpdateTDDBRejections' выглядеть –

+0

@ TavianBarnes добавил. Это не очень славно, я просто пытаюсь назвать класс прямо сейчас, чтобы я мог заставить его работать, а затем его собираюсь получить к нему больше. Это «доказательство концепции», чтобы показать, что я могу это сделать. –

+4

Ум, вы должны перенести работу на метод 'run()', а не на конструктор. Конструктор запускается только один раз, когда вы делаете 'new UpdateTDDBRejections()' –

ответ

5

Это метод 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); 
         // ^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

Оооо! Brilliant! Да, это было ТОЧНО, что я собирался! Спасибо! –

+0

Добро пожаловать :-) – aioobe

+0

Если бы я хотел передать переменные этому конструктору, как бы настроить его? –

Смежные вопросы