2017-03-02 39 views
0

我試圖每分鐘運行一個作業[其中包含3個服務應該平行運行]。以下是我的代碼片段。Java ScheduledExecutorService定期運行

ExecutorService service = Executors.newFixedThreadPool(servicesMap.size()); 
for (Map.Entry entry : servicesMap.entrySet()) { 
    service.submit(new MyService(conn, serviceID)); 
    // here serviceID is id1 id2 id3 these three job should execute parallel 
} 

注:MyTask實現贖回& servicesMap將3總是

如果我嘗試使用ScheduledExecutorService的話,我能不能夠實現它。 它說scheduleService.schedule不接受贖回型parameterts

ScheduledExecutorService scheduleService = Executors.newScheduledThreadPool(servicesMap.size()); 
for (Map.Entry entry : servicesMap.entrySet()) { 
    scheduleService.schedule((new MyService(conn, serviceID)), 0, 60, TimeUnit.SECONDS); 
} 

請幫忙修改ScheduledExecutorService的代碼來實現這一目標。

回答

1

您的schedule(…)調用包含的參數多於the method有參數。

雖然我不確定你究竟是什麼。如果你想在一分鐘在未來運行的服務,然後使用下面的調用:

scheduleService.schedule(new MyService(conn, serviceID), 60, TimeUnit.SECONDS); 

相反,如果你想每分鐘(立即啓動)運行服務,然後使用一個下面的兩個來電:

scheduleService.scheduleAtFixedRate(new MyService(conn, serviceID), 0, 60, TimeUnit.SECONDS); 
scheduleService.scheduleWithFixedDelay(new MyService(conn, serviceID), 0, 60, TimeUnit.SECONDS); 

關於在評論你的後續問題:

如何讓,一分鐘內ute Service1 Service2 Service3應該平行運行,然後下一分鐘也一樣。

ScheduledExecutorService scheduleService = …; 
Collection<Callable<Void>> services = …; 
Runnable svcRunner = new Runnable() { 
    @Override 
    public void run() { 
     Collection<Future<Void>> futures = new ArrayList<>(services.size()); 
     // start all services in parallel 
     for (Callable<Void> service : services) { 
      // any ExecutorService would do here, i.e., doesn't have to be a 
      // ScheduledExecutorService 
      futures.add(scheduleService.submit(service)); 
     } 
     // wait for all services to complete 
     for (Future<Void> future : futures) { 
      try { 
       future.get(); 
      } catch (InterruptedException | ExecutionException e) { 
       // TODO do something meaningful 
      } 
     } 
    } 
}; 
// run the scheduler every minute (i.e., one minute after the last service 
// has finished), starting now 
scheduleService.scheduleWithFixedDelay(svcRunner, 0, 60, TimeUnit.SECONDS); 

爲了簡單起見,我已存儲的服務集中。如果需要,您也可以每次重新創建它們。

+0

注意到Chriki。所以這將運行Service1 Service2 Service3獨立並行每分鐘權利。如何在一分鐘內完成Service1 Service2 Service3應該平行運行,然後在下一分鐘進行。 – DEADEND

+0

Chriki .. for循環 - 它會循環三次。在循環內部,我寫了scheduleService.schedule。這是對的嗎? – DEADEND

+0

我們正在觸發通知服務批次。這批將每分鐘運行一次。 我們需要在每分鐘內並行運行3個服務,這三個服務將觸發電子郵件和短信給不同的客戶。 這件事我正在努力實現它。請讓我知道,如果我的解釋不明白。 – DEADEND

相關問題