2016-04-11 3 views
1

J'essaie de mettre en œuvre des tâches d'arrière-plan en cours d'exécution pour mon application. Pour cela j'ai utilisé ScheduledExecutorService classe. J'ai 2 services Service A et Service B ont tous deux une tâche qui s'exécute tout le temps après un certain intervalle de temps. Pour cela j'ai utilisé ce qui suit dans Service A et Service BScheduledExecutorService. comment exécuter deux tâches après un intervalle de temps dans 2 services distincts

Ceci est le code qui est commun dans les deux classes de service.

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

Maintenant, le problème est quand je lance app les services démarre mais seulement que scheduledExecutorService de Service A fonctionne autre ne fonctionne pas. Qu'est ce que je fais mal? P.S j'utilise ScheduledExecutorService pour la première fois.

Répondre

0

Le ScheduledExecutorService attendra que vos tâches se terminent, si une prend plus de temps que le rate vous spécifiez (dans votre cas 1000 secondes). Jetez un oeil à la Javadoc respective:

[...] Si l'exécution de cette tâche est plus longue que la période, puis les exécutions ultérieures peuvent commencer en retard, mais ne sera pas exécuter simultanément.

Étant donné que vos services semblent se comporter comme daemons (et donc continuer à courir jusqu'à ce que l'application est fermée), vous pouvez le faire comme ceci:

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

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

simplement déléguer l'exécution réelle de vos services un pool distinct qui n'affecte pas le scheduler.