我有一个Java servlet,它启动了一个冗长的任务,可以在发送响应后在后台执行。我可以从日志条目中看出,即使启动线程是我在servlet中做的最后一件事,框架仍然在新线程启动后执行与请求相关的代码。
我正在考虑将当前线程传递给新线程的构造函数(parentThread),保存该引用,并调用parentThread.join()作为run()中的第一个语句。但这似乎非常糟糕。
是否有更好/更优雅的解决方案?
答案 0 :(得分:1)
通常,Servlet容器会对线程进行池化/回收,因此等待终止时几乎没有意义。 如果你可以独立于当前请求完成工作,那么生成线程应该没有任何问题。
根据您的生态系统,您应该查看Spring执行器服务,甚至是@Asynchronous抽象,以便安排后台任务。您可能也想查看异步servlet API。
答案 1 :(得分:0)
查看ThreadPoolExecutor类,看看它是否能更好地满足您的需求,而不是滚动自己的线程。我通常在servlet初始化时启动线程,然后doGet()和doPost()方法只提交到队列并返回。在servlet运行时,执行程序将在后台运行。
在语句中有更多细节会很有用:“在新线程启动后,框架仍在执行与请求相关的代码。”