如何在servlet中运行不同的线程?

时间:2013-06-25 01:20:27

标签: java multithreading servlets

如何从servlet运行不同的线程?我在servlet的init()方法中有以下代码。

FileThread myThread = new FileThread();
myThread.start();
myThread.run();     

FileThread应该看到一些文件夹来检查文件是否被更改。所以这个线程在循环中运行。但它不像我预期的那样有效。它冻结(服务器不返回HTML)服务器的服务。

我希望这个线程在后台运行,而不是干扰servlet的进程。我怎么能做到这一点?

2 个答案:

答案 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服务 可以用来提交任务)