在 Web 环境中启动自己的线程可能不是最推荐的做法,而在 Java EE 环境中,这实际上是违反规范的。
Servlet 3.0 具有异步支持,请在此处查看更多信息
例如
@WebServlet("/foo" asyncSupported=true)
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
...
AsyncContext aCtx = request.startAsync(req, res);
ScheduledThreadPoolExecutor executor = new ThreadPoolExecutor(10);
executor.execute(new AsyncWebService(aCtx));
}
}
public class AsyncWebService implements Runnable {
AsyncContext ctx;
public AsyncWebService(AsyncContext ctx) {
this.ctx = ctx;
}
public void run() {
// Invoke web service and save result in request attribute
// Dispatch the request to render the result to a JSP.
ctx.dispatch("/render.jsp");
}
}
Java EE 6 和 7 具有@Asyncronous方法调用
Java EE 7 具有并发实用程序(例如托管的执行器服务,您可以使用它来提交任务)