servlet应该等待任务完成

时间:2013-10-06 00:02:14

标签: java multithreading

如何使servlet在销毁之前等待当前任务完成?

更新了......

@WebListener
public class EmailServlet implements ServletContextListener {
private ScheduledExecutorService executorService;
ScheduledFuture scheduledFuture;
private int delay = 300000;
private int repeat = 300000;

@Override
public void contextInitialized(ServletContextEvent event) {
    System.out.println("The email servlet started");
    executorService = Executors.newSingleThreadScheduledExecutor();
    scheduledFuture = executorService.scheduleWithFixedDelay(new Task3(), delay, repeat, TimeUnit.MILLISECONDS);

}

@Override
public void contextDestroyed(ServletContextEvent event) {

    scheduledFuture.cancel(true);
    executorService.shutdown();
    System.out.println("The email servlet stopped");
}
}

2 个答案:

答案 0 :(得分:0)

您可以使用Future isDone方法继续检查您的任务状态。一旦它返回true,你就可以退出。做类似的事情:

while(!scheduledFuture.isDone()) {
  // wait to return till the end of this loop
}

但这里存在风险,如果你的任务永远不会结束,那么你将永远无法返回,而servlet可能会超时。因此,请将适当的定时等待任务完成。

答案 1 :(得分:0)

“继续工作”的经典方法只是产生一个新线程:

  

http://oreilly.com/catalog/jservlet/chapter/ch03.html

     

Servlets不仅可以在访问之间保持简单。他们能   也在访问之间执行。 servlet启动的任何线程都可以   即使在发送响应后仍继续执行。这种能力   证明对于增量结果的长期任务最有用   应该可供多个客户使用。背景线程   在init()中启动,在请求处理时执行连续工作   线程使用doGet()显示当前状态。这是一个类似的   动画小程序中使用的技术,其中一个线程发生变化   图片和另一个画出了画面。

在“ScheduledExecutorService”存在之前很久就已经存在。

问:你想做什么,ScheduledExecutorService(或一个简单的线程)还没有提供?