2013-06-25 40 views
1

如何從一個servlet運行不同的線程?我在servlet的init()方法中有下面的代碼。如何在servlet中運行不同的線程?

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

FileThread應該看到一些文件夾來檢查文件是否被改變。所以這個線程被做成循環運行。但它沒有像我預期的那樣工作。它凍結(服務器不返回HTML)服務器的服務。

我想讓這個線程在後臺運行,而不是干擾servlet的進程。我怎樣才能做到這一點?

+6

注意應該是在Java EE容器中產生非託管線程是一個非常糟糕的主意。從這裏開始:http://stackoverflow.com/questions/8327880/can-i-spawn-new-threads-in-jsp/8328113#8328113 – BalusC

回答

6

您通常不會在Thread上調用.run(),因爲它會使run()方法在當前線程上運行,而不是在新線程上運行!你說你有一個無限循環,因此servlet不會完成初始化,因此它不會提供任何請求!

您需要在Thread對象上調用.start()。此方法將使JVM啓動一個新的執行線程,該線程將運行Thread對象的run()方法中的代碼。

+0

+1 - 釘了它!調用'run()'意味着servlet線程現在要去執行工作線程應該執行的「活動」。 –

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(管理執行器服務例如你可以用 來提交任務)

相關問題