Java ScheduledExecutorService标准实践

时间:2014-05-12 13:51:40

标签: java java-ee scheduledexecutorservice

我在J2EE应用程序中使用ScheduledExecutorService来从配置文件中每隔x秒计划一次任务(从数据库中获取数据并将它们发送到外部服务器)。我的代码是:

try{
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    service.scheduleWithFixedDelay(new Runnable(){
    public void run(){
                RsaBaseAction rsa = RsaBaseAction.getInstance();//class that does all the work
                rsa.rsaBaseAction();
            }
          }, 0, timeInterval, TimeUnit.SECONDS);
     }
     catch(Exception ex){
         ex.printStackTrace();
     }

我的问题是我应该编写任何额外的代码吗?我应该编写一个while循环以确保线程已完成,然后执行service.shutdown()ScheduledExecutorService为我处理这个问题吗?

2 个答案:

答案 0 :(得分:0)

如果您希望调度程序停止计划事件,则可以调用shutdown。您不需要明确地执行此操作,就像您希望它在应用程序的生命周期中运行一样。如果出于某种原因,调度不再有任何意义,您可以使用shutdown方法。

一个例子。您正在编写一个CMS,它提供与Google购物集成以上传产品信息。如果用户删除了他们的上传信息(即关闭它),您可以调用shutdown来停止服务进行同步。

答案 1 :(得分:0)

由于shutdown方法上的Javadoc明确指出:

  

启动有序关闭,其中先前提交的任务已执行,但不会接受任何新任务。如果已经关闭,调用没有其他影响。   此方法不会等待先前提交的任务完成执行。使用awaitTermination来做到这一点。

即。以前的任务将要完成,不会有新任务完成,但如果需要一段时间,之前的任务可能会继续超过shutdown命令。

至于你的代码 - 我没有看到try-catch块的任何原因。调度任务不会抛出任何异常。看起来您想要实际尝试捕获rsaBaseAction而不是调度(如果runnable抛出异常,则不再调度执行,并且异常由线程组异常处理程序处理)