Java servlet应该等待任务完成
如何使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
@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(或一个简单线程)还没有提供,您想做什么?如何安排适当的等待时间?它将在我的应用程序后台发送电子邮件。我不想在发送电子邮件时关闭服务器。