java - 如何使用 ScheduledExecutorService 通过多个服务定期运行作业

标签 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,我无法编写代码来并行执行服务,也无法每分钟运行该作业。

上面是我的代码片段。请帮我解决这个问题。

最佳答案

首先,您应该调用 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/

相关文章:

java - Hibernate 不会将特定对象保存到数据库

java - ExecutorService.awaitTermination() 永远不会超时

android - 从 Executor 服务返回数据

java - 如何使用 ScheduledExecutorService 每天在特定时间运行特定任务?

java - 包含更多类(class)的地址簿程序

java - EasyMock 返回奇怪的值

java - 添加条件以接受 HashMap 中的特定条目

java - 我的 ExecutorService 代码有什么问题吗?

java - ScheduledExecutorService - 任务停止运行

java - 预定的执行者 : poll for result at fix rate and exit if timeout or result valid