如何从servlet运行不同的线程?我在servlet的init()
方法中有以下代码。
FileThread myThread = new FileThread();
myThread.start();
myThread.run();
FileThread应该看到一些文件夹来检查文件是否被更改。所以这个线程在循环中运行。但它不像我预期的那样有效。它冻结(服务器不返回HTML)服务器的服务。
我希望这个线程在后台运行,而不是干扰servlet的进程。我怎么能做到这一点?
答案 0 :(得分:6)
您通常不会在.run()
上调用Thread
,因为它会使run()
方法在当前线程上运行,而不是在新线程上运行!你说你有一个无限循环,因此servlet永远不会完成初始化,因此它不会提供任何请求!
您只需在.start()
对象上调用Thread
即可。此方法将使JVM启动一个新的执行线程,该线程将运行该run()
对象的Thread
方法中的代码。
答案 1 :(得分:5)
启动自己的线程可能不是Web环境中最推荐的东西,而在Java EE环境中,它实际上是违反规范的。
Servlet 3.0具有异步支持,请参阅更多here
例如
@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有Concurrency Utilities(例如托管的Executor服务 可以用来提交任务)