Java servlet应该等待任务完成

Java servlet应该等待任务完成,java,multithreading,Java,Multithreading,如何使servlet在销毁之前等待当前任务完成 更新 @WebListener public class EmailServlet implements ServletContextListener { private ScheduledExecutorService executorService; ScheduledFuture scheduledFuture; private int delay = 300000; private int repeat = 300000; @Overri

如何使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");
}
}

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

while(!scheduledFuture.isDone()) {
  // wait to return till the end of this loop
}
但这里有一个风险,若您的任务永远不会结束,那个么您将永远无法返回,servlet可能会超时。因此,请在适当的时间内等待任务完成。

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

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

早在“ScheduledExecutorService”存在之前,情况就是这样


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

如何安排适当的等待时间?它将在我的应用程序后台发送电子邮件。我不想在发送电子邮件时关闭服务器。