2012-10-31 55 views
1

目前,我正在運行一個無線程模型,該模型不能正常工作,因爲我在處理交付的數據之前內存不足。我已經做了所有可以優化代碼的更改,但仍然不夠快。Java中的簡單多線程

顯然我應該轉向線程模型。我想知道什麼是最簡單,做以下簡單的方法是:

  • 主線程傳遞一些信息給工人
  • 那個工人進行了一些工作,我將重構出的主要方法
  • 工人將消失,需要

時,我從來沒有與Java線程工作,從我讀了上似乎很複雜,即使我正在尋找新的將被實例化看起來很簡單。

+5

是什麼讓你覺得這會爲你節省任何內存?處理沒有改變。 –

+1

'ExecutorService'處理除你的實際工作邏輯以外的所有內容。 – pickypg

+2

添加多線程可能會增加而不是減少內存需求,因爲多個線程將同時處理數據。也許討論你正在解決的實際問題將會很有用,並詢問如何減少它的內存需求。 –

回答

1

如果您有多個獨立的工作單位具有相同的優先級,最好的解決方案通常是某種工作隊列,其中有限數量的線程(選擇的數量以優化性能)坐在從隊列中取出工作單元並執行它們的while(true)循環中。

一般來說,線程的最佳數量將是處理器數量的+/- 1,但在某些情況下,如果線程傾向於受到磁盤I/O請求或某些類型的阻礙,那麼較大的數字將是最優的。

但請記住,可能需要調整整個系統。例如,您可能需要更多的磁盤臂,並且可能需要更多的RAM。

+0

+1;使得多線程簡單易懂 – cheeken

+0

是的,一個[LinkedBlockingQueue](http://docs.oracle.com)。 com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html)似乎是選擇的隊列。 –

+0

如果工作單元具有相同的優先級,那麼它本身無關緊要,因此一個簡單的'ThreadPooledExecutor'將會更容易實現,因爲除了封裝工作單元之外,絕對需要處理所有的事情。使用隊列執行的工作比Java 4之外的工作要多。使用['PriorityBlockingQueue'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/PriorityBlockingQueue.html)將會很有用,如果優先級成爲問題。 – pickypg

0

我具有通過Java Concurrency和進修讀開始;)

特別,我會花一些時間去了解Executors API,因爲它會做大部分的你所描述什麼沒有很多的處理許多鎖的開銷;)

+0

這是一個非常蓬鬆的'閱讀標準文本'的答案,-1沒有解決基本問題:(工作隊列爲 – Toby

0

將內存消耗分配給多個線程不會改變整體內存消耗。從我讀到的問題中,我想向前走,告訴你:增加Java引擎的堆,這將有所幫助。看起來你必須優化Java啓動參數,而不是你的代碼。如果我錯了,那麼你將不得不緩衝數據。到磁盤!不是在相同內存模型中的線程。