我试图每分钟执行一封电子邮件作业。工作有 5 项服务。每 5 个服务应并行运行。
使用ExecutorService:
ExecutorService service = null;
if (serviceMap != null && serviceMap.size() > 0) {
for (;;) {
service = Executors.newFixedThreadPool(serviceMap.size()); // Here Service Map size will be 5
for (Map.Entry entry : serviceMap.entrySet()) {
service.submit(new EmailService(conn, mailParam));
}
service.shutdown();
service.awaitTermination(1, TimeUnit.MINUTES);
}
}
使用 ScheduledExecutorService :
ScheduledExecutorService scheduledExecutorService = null;
if (serviceMap != null && serviceMap.size() > 0) {
scheduledExecutorService = Executors.newFixedThreadPool(serviceMap.size()); // Here Service Map size will be 5
for (Map.Entry entry : serviceMap.entrySet()) {
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(new EmailService(conn, mailParam),
60,
TimeUnit.SECONDS);
System.out.println("result = " + scheduledFuture.get());
}
scheduledExecutorService.shutdown();
}
如果我使用 ExecutorService,我会每隔一分钟关闭服务并再次执行该服务。还好吗?
如果我使用 ScheduledExecutorService,我无法编写代码来并行执行服务,也无法每分钟运行该作业。
上面是我的代码片段。请帮我解决这个问题。
最佳答案
首先,您应该调用 newScheduledThreadPool()
来创建 ScheduledExecutorService
,这是正确的调度执行器服务。
那么您应该使用 [scheduleAtFixedRate][1]
方法每分钟安排一个任务,初始延迟 60 秒。
ScheduledExecutorService scheduledExecutorService = null;
if (serviceMap != null && serviceMap.size() > 0) {
scheduledExecutorService = Executors.newScheduledThreadPool(serviceMap.size()); // Here Service Map size will be 5
for (Map.Entry entry : serviceMap.entrySet()) {
scheduledExecutorService.scheduleAtFixedRate(new EmailService(conn, mailParam),
60,
60,
TimeUnit.SECONDS);
}
}
关于java - 如何使用 ScheduledExecutorService 通过多个服务定期运行作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42483416/