2012-07-26 44 views
2

裏面我有一個servlet訪問從一個線程請求對象一個servlet

public void doPost(HttpServletRequest request, HttpServletResponse response) { 
    final HttpServletRequest requestF = request; 
    Runnable runner = new Runnable() { 
     public void run() { 
      String something = requestF.getParameter("anything"); 
      //do other things... 
     } 
    }; 
    Thread thread = new Thread(runner); 
    thread.start(); 

運行此代碼但當我嘗試從請求對象的參數,它拋出一個異常。

Exception in thread "Thread-25" java.lang.NullPointerException 
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2560) 
    at org.apache.catalina.connector.Request.getParameter(Request.java:1086) 
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355) 
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158) 
    at br.com.test.controller.ajax.MyServlet$1.run(MyServlet.java:54) 
    at java.lang.Thread.run(Thread.java:619) 

requestF對象不爲空,我檢查過了。 有誰知道我是否可以訪問新的Thread內的請求對象?

+0

只是爲了更清楚:我想訪問請求在線程內,因爲它有一個很大的for()語句,我不想​​爲()語句運行另一個' – 2012-07-26 18:11:02

回答

1

是的,Zaske是對的。 您可以複製使用地圖對象的新實例,就像這樣:

final Map<String,String> mapParameters = new HashMap<String,String>(); 
mapParameters.putAll(request.getParameterMap()); 

,並使用mapParameters你的「運行」方法中:

public void doPost(HttpServletRequest request, HttpServletResponse response) { 
    final Map<String,String> mapParameters = new HashMap<String,String>(); 
    mapParameters.putAll(request.getParameterMap()); 
    Runnable runner = new Runnable() { 
     public void run() { 
      String something = mapParameters.get("anything"); 
      //do other things... 
     } 
    }; 
    Thread thread = new Thread(runner); 
    thread.start(); 
} 
+0

這對我有用。 – 2012-07-26 18:57:49

+0

@RenatoLochetti - 太糟糕了,你不相信我。我還提供了時間和精力來思考你的問題。 – 2012-07-27 04:16:40

1

的確,請求不爲空。
我懷疑發生了什麼,因爲你有一個對請求對象的引用,GC沒有收集它。
但是,在處理響應之後,參數上的一些清理代碼(即 - 刪除請求參數的所有條目)被執行。
我想這可能發生,爲了釋放內存資源,而不是等待GC,這就是爲什麼你面對這個空指針異常,這不是由於空請求對象的空訪問,而是由於參數
我會建議您獲取參數集合,將其複製到新的數據結構(即 - 地圖)並將其傳遞給您的線程。
另外,您應該考慮是否希望線程在發送給客戶端的響應之前運行,但這純粹是一個設計問題。

+0

謝謝你的anwser Zaske。我沒有意識到新的請求對象只是對舊的引用。 – 2012-07-27 10:56:50