2012-08-28 90 views
2

我正在爲一個線程安全的單元測試一個類。我從不同的線程調用它的方法,以確保它們都得到相同的結果(簡而言之)。這是我如何決定使用多少線程:在單元測試中使用多少個線程?

int threads = Runtime.getRuntime().availableProcessors() * 4; 

這是一個很好的做法嗎?我應該使用多少個?越多越好?

+1

要清楚:我認爲效率不是這個問題的主要問題,它是正確的嗎? (似乎答案專注於這方面,儘管它似乎不是你的意圖) – amit

+0

也許看看以前的問題:http://stackoverflow.com/questions/12159/how-should-i-unit -test-threaded-code –

+0

使用單元測試無法保證您會發現多線程錯誤。如果測試失敗,您發現問題,如果測試通過,可能是測試發生了。我會嘗試不同的選擇,看看你認爲最有可能失敗的東西。 –

回答

6

最好的價值,我一般運行3組測試:

  • 一個線程來檢查正確的行爲在單線程環境
  • 數量的處理器+ 1(或任何典型的應用設置)
  • 許多線程(比如1000),以增加上下文切換和爭

而對於多線程測試中,我嘗試通過使任務的開始與CountDownLatch同步來最大化交織,以便所有線程同時開始或多或少地執行它們的任務。

我也嘗試在測試過程中避免額外的同步(例如,通過使用線程安全結構來存儲一些結果),因爲它可能會「人工重新同步」測試代碼 - 要根據具體情況進行評估。

JCiP,第12章是高效多線程測試的靈感來源(即提供許多提示來引發併發錯誤)。

最後,正如@PeterLawrey指出的那樣,您不能保證您的代碼在測試時是線程安全的,您只能嘗試增加查找併發錯誤的機會。

0

這取決於線程執行了多少IO。對於CPU密集型任務,每1核心有1個線程是好的,但是如果您正在等待IO任務(如數據庫讀取/寫入操作,文件操作) - 將每個核心的線程數增加到2個或更多是安全的。只是衡量績效,你會得到你的測試:)

0

線程問題通常出現很少,所以想到的是,你越強調它就越會帶出競爭條件,爭用問題等

所以4個* #processors大概是不會放棄你非常有意義的結果。事實上,它甚至可能會讓你對所有工作都產生誤解。

您應該估計有多少線程會在生產中同時運行多少線程,然後超出該數目一定的幅度。