2016-04-11 1 views
1

Я пытаюсь реализовать постоянно выполняемые фоновые задачи для своего приложения. Для этого я использовал ScheduledExecutorService класс. У меня есть 2 службы Service A и Service B У обоих есть задача, которая работает все время через некоторый временной интервал. Для этого я использовал это в Service A и Service BScheduledExecutorService. как запустить две задачи после некоторого интервала времени в 2 отдельных службах

Это код, который является общим для обоих классов обслуживания.

Runnable postNotificationRunnable = new Runnable() { 
      @Override 
      public void run() { 
      // statements here} 
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 
    scheduledExecutorService.scheduleAtFixedRate(postNotificationRunnable, 0, 1000, TimeUnit.SECONDS); 

Теперь проблема, когда я запустить приложение как начинается услуги, но только лишь scheduledExecutorService из Service A бежит другой один не работает. что я делаю неправильно? P.S Я использую ScheduledExecutorService в первый раз.

ответ

0

ScheduledExecutorService будет ждать завершения ваших задач, если требуется больше времени, чем ставка вы указываете (в вашем случае 1000 секунд). Посмотрите на соответствующий Javadoc:

[...] Если какое-либо выполнение этой задачи занимает больше времени, чем период, то последующее выполнение может начаться с опозданием, но не будет одновременно выполнять.

Поскольку ваши услуги, кажется, ведут себя как демоны (и, следовательно, продолжать работать, пока приложение не будет выключен), вы можете сделать это следующим образом:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
ExecutorService pool = Executors.newCachedThreadPool(); 

scheduler.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     pool.execute(postNotificationRunnable); 
    } 
}, 0L, 1000L, TimeUnit.SECONDS); 

Просто передать фактическое исполнение ваших услуг отдельный pool, который не влияет на scheduler.

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