2011-05-24 32 views
2

一般的問題,它可以在c我猜也
如果我有(在我的情況下http requst類)調用包裝函數
這個包裝函數是公共API。然後在包裝函數裏面我初始化新的請求對象,假設用來自包裝函數的參數做請求
我是否需要將請求對象包裝在線程中(我有線程池類執行工作線程)
確實創建對於每個請求堆棧上的對象會做什麼?
例如:java:如果我在每個請求上創建新的對象,我是否還需要線程?

public void Wrapper(String a,String b) 
{ 

// im doing .. 
MyRequst req = new MyRequest(a,b); // will do the http requst 

} 

or to do : 

public void Wrapper(String a,String b) 
{ 

// im doing .. 
MyThreadPool.GetInstance().RunTask(new MyRequest(a,b)); // will do the http request 

} 
+1

什麼是你的使用情況? – 2011-05-24 12:28:36

+0

一般來說,如果處理請求是一個長時間運行的任務,或者涉及阻塞IO,那麼每個應該在一個單獨的線程中處理。 – mre 2011-05-24 12:31:46

回答

3

的問題不是很清楚,但是從可以推斷,相關的問題是,是否創建本地變量是足夠的線程安全。答案是肯定的。

Java Concurrency in Practice

訪問共享,可變數據 要求使用同步;單程 避免這種要求是不 份額。如果僅從 單線程訪問數據,則不需要同步 。

應該記住所有對象都存儲在堆中。堆棧中的項目是primitives and references to objects on the heap, and are termed as local variables,並且總是單字寬(除了長整數和雙整數值);這些變量不要與Java編程語言中的方法局部變量(人們錯誤地認爲存儲在堆棧中)的概念混淆。

通過使用局部變量,可以確保只有當前執行線程才能訪問堆上的對象,當然,除非嘗試與其他線程共享這些對象(在這種情況下,適當的同步技術需要被僱用)。

0

這給出了你可能試圖做的替代方案。 我假設你正在嘗試操縱請求對象。你有沒有考慮過使用「HttpServletRequestWrapper」。

http://download.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletRequestWrapper.html

檢查此鏈接:http://www.oracle.com/technetwork/java/filters-137243.html 在上面的網頁轉到它說「編程定製請求和響應」一節。

又如, http://www.coderanch.com/t/172274/java-Web-Component-SCWCD/certification/When-HttpRequestWrapper

相關問題