由于许多原因,在servlet中使用线程并不是一种好习惯。
java.util.Timer
似乎是一个线程的包装器。那么,使用它也不安全吗?
如果是这样,在servlet中安排任务的最安全的方法是什么?
答案 0 :(得分:9)
是的,您可以使用计时器。
要记住的一个重要事情是在servlet停止时取消该计时器。如果您忘记取消Timer,您的webapp将遭受内存泄漏(类加载器泄漏,因为Timer的Thread通过其ContextClassLoader绑定到WebappClassLoader)并且无法多次部署。
答案 1 :(得分:2)
是。这是非常安全的。 servlet容器将查看HTTP请求的线程,但是您可以自己生成aditional线程,无论它们的生命周期是否受限于请求的生命周期,或者更长。
e.g。一种常见的模式是生成一个长时间运行的处理线程。 Servlet请求会将工作项放在队列中(用于带外处理),长时间运行的处理线程将处理这些工作项。
Here's an article from OReilly详细说明了servlet和EJB中的计时器使用情况。