如何使用ScheduledExecutorService定期运行多个服务

时间:2017-02-27 10:31:28

标签: java executorservice scheduledexecutorservice

我正在尝试每分钟执行一次电子邮件作业。约伯有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,我无法编写代码来并行执行服务,并且无法每分钟运行一次该作业。

以上是我的代码段。请帮我解决。

2 个答案:

答案 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);
  }