2017-03-02 68 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

相关问题