我正在使用ScheduledExecutorService在一个J2EE应用程序中调度一个任务,每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来处理呢?
发布于 2014-05-12 14:01:06
如果希望调度程序停止调度事件,可以调用shutdown。您不需要显式地这样做,就好像您希望它在应用程序的生命周期中运行一样。如果由于某种原因,调度不再有意义,您将使用shutdown方法。
举个例子。您正在编写一个CMS,它提供与谷歌购物的集成,以上传产品信息。如果用户删除他们的上传信息(即关闭它),您可以调用关机来停止服务进行同步。
发布于 2014-05-12 14:13:45
正如shutdown方法上的Javadoc明确指出的那样:
启动有序关机,执行以前提交的任务,但不接受任何新任务。如果已经关闭,则调用没有其他效果。此方法不等待以前提交的任务完成执行。使用awaitTermination来完成这个任务。
也就是说,以前的任务将要完成,没有新的任务要完成,但是如果需要一段时间,以前的任务可能会继续通过shutdown命令。
至于您所拥有的代码,我看不出有什么理由使用try-catch块。调度任务不会引发任何异常。看起来您想要实际地尝试-捕获rsaBaseAction而不是调度(如果runnable抛出了一个异常,则不再调度执行,该异常由线程组异常处理程序处理)。
https://stackoverflow.com/questions/23610915
复制相似问题