0

我在 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照顾它吗?

4

2 回答 2

0

正如该shutdown方法上的 Javadoc 明确指出的那样:

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

即之前的任务将要完成,没有新的任务将要完成,但是shutdown如果需要一段时间,之前的任务可能会继续执行命令。

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

于 2014-05-12T14:13:45.257 回答
0

shutdown如果您希望调度程序停止调度事件,您会调用。您不需要明确地执行此操作,就好像您希望它在应用程序的整个生命周期内运行一样。shutdown如果由于某种原因调度不再有意义,您将使用该方法。

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

于 2014-05-12T14:01:06.687 回答