我正在尝试每分钟执行一次电子邮件作业。约伯有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,我无法编写代码来并行执行服务,并且无法每分钟运行一次该作业。
以上是我的代码段。请帮我解决。
答案 0 :(得分:2)
首先,您应该调用创建newScheduledThreadPool()
的{{1}},这是正确的调度执行程序服务。
然后你应该使用ScheduledExecutorService
方法每分钟安排一个任务,初始延迟为60秒。
[scheduleAtFixedRate][1]
答案 1 :(得分:0)
好问题!!
您必须将其分为两个类。
一个是启动调度程序。另一个用于执行实现Callable或Runnable接口的服务。
scheduledExecutorService.schedule()与service.submit()不同。
schedule()用于安排流程,而submit用于提交服务。
启动计划程序类:
public static void main(String[] args) {
Class2 runnable = new Class2() {
@Override
public void run() {
// call method that has ExecuteService Impl
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS);
}