Java ExecutorService无限循环作业

时间:2017-02-21 12:20:09

标签: java multithreading executorservice

我正在尝试在java中编写守护程序服务作业。这项服务将每分钟运行一次。

但我无法通过使用ExecutorService来实现这一点,我不知道这是否正确。以下是我的代码段:

public void startService() {
    try {
        ExecutorService service = Executors.newFixedThreadPool(3);

        for (;;) {
            service.submit(new Service1()); // this will send some set of emails
            service.submit(new Service2()); // this will send some set of emails
            service.submit(new Service3()); // this will send some set of sms
        }
        service.shutdown(); // It says Unreachable code so when should i shutdown the service
        service.awaitTermination(1, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

3 个答案:

答案 0 :(得分:4)

首先,您需要查看ScheduledExecutorService及其实现。此服务允许您安排作业以预定义的频率运行。这是简短的答案。至于实施细节,有太多的未知数可以为您提供实用的建议。您希望程序在容器(Web或Application Server)中运行,还是作为具有域线程的Standalone运行?你在Unix / Linux上运行(所以可以使用Cron作业调度程序)还是Windows?其中一个调度程序选项可能是quartz-scheduler。我希望这会有所帮助。

答案 1 :(得分:3)

您的for loop没有结束条件for(;;),并且没有中断语句。

所有代码 此循环之后的所有代码无法访问

你必须在循环中等待1分钟 ,而不是等待(因为循环后的代码永远不会被运行)。

保持你的synthax,我想它应该是:

for (;;) {
    service.submit(new Service1()); // this will send some set of emails
    service.submit(new Service2()); // this will send some set of emails
    service.submit(new Service3()); // this will send some set of sms
    service.shutdown();
    service.awaitTermination(1, TimeUnit.MINUTES);
}

答案 2 :(得分:1)

这里:

for (;;) {
        service.submit(new Service1()); // this will send some set of emails
        service.submit(new Service2()); // this will send some set of emails
        service.submit(new Service3()); // this will send some set of sms
    }

是无限循环;它不断向你的线程池提交新的工作......每分钟一次,但每次迭代一次。你必须慢化你的循环!

我不确定你要求的是什么,但你应该简单地删除那个循环结构;或者更可能的是,做一些事情:

while (true) {
  service.submit(new Service1()); // this will send some set of emails
  service.submit(new Service2()); // this will send some set of emails
  service.submit(new Service3()); // this will send some set of sms
  Thread.sleep( 1 minute );
}

或类似的东西。