2016-04-11 3 views
1

Ich versuche, kontinuierlich laufende Hintergrundaufgaben für meine App zu implementieren. Dafür habe ich ScheduledExecutorService Klasse verwendet. Ich habe 2 Dienste Service A und Service B beide haben eine Aufgabe, die die ganze Zeit nach einem Zeitintervall läuft. Dafür habe ich folgendes in Service A und Service BScheduledExecutorService. wie man zwei Aufgaben nach einiger Zeitintervall in 2 separaten Diensten ausführt

Dies ist der Code, der in beiden Serviceklassen üblich ist.

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

Nun das Problem ist, wenn ich beide Starts Dienste App laufen, aber nur nur ScheduledExecutorService von Service A läuft andere läuft nicht. was mache ich falsch? P.S Ich verwende ScheduledExecutorService zum ersten Mal.

Antwort

0

Die ScheduledExecutorService warten auf Ihre Aufgaben zu beenden, wenn Sie länger als die Rate, die Sie angeben (in Ihrem Fall 1000 Sekunden) dauert. Werfen Sie einen Blick auf die jeweiligen Javadoc:

[...] Wenn eine Ausführung dieser Aufgabe länger als seine Zeit dauert, dann nachfolgende Ausführungen kann spät beginnen, wird aber nicht gleichzeitig ausgeführt werden.

Da Ihre Dienste wie Dämonen zu verhalten scheinen (und damit weiterlaufen, bis die Anwendung heruntergefahren wird), können Sie es wie folgt tun:

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

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

einfach die tatsächliche Ausführung Ihrer Dienste delegieren eine separate pool, die nicht die scheduler betrifft.

Verwandte Themen