2014-06-21 55 views
0

我有一個100個字符串的列表。對於每個字符串,我需要執行3個任務。 所以我介紹的併發線程Java併發性線程錯誤

Class A implements Runnable 
{ 

    String str; 
    A(String s) 
    { 
    str = s; 
    } 

    public static void main(String[] args) 
    { 
    Runnable runnable = null; 

     //For Each of my strings 
     for(String s:MyList) 
     { 
      runnable = new A(s); 
      new Thread(runnable).start(); 
     } 
    } 

    @Override 
    public void run() { 
     task1(); 
     task2(); 
     task3(); 
    } 
} 

這跑進一個例外。螺紋

異常「主要」 java.lang.OutOfMemoryError:GC開銷超過限制 異常在線程「線程0」 java.lang.OutOfMemoryError:Java堆空間

如何克服這一點,並限制線程大小?

我試過使用這個。

ExecutorService pool = Executors.newFixedThreadPool(10); 
pool.execute(runnable); 

它不起作用。

+1

您是否爲每次迭代創建一個新的線程池? – Smutje

+1

你應該回去嘗試讓你的'ExecutorService'版本工作。因爲這是運行100個異步任務的更合理的方式。 – Kenster

回答

3

「java.lang.OutOfMemoryError:Java堆空間」的含義與它所說的完全相同 - 堆(分配新Java對象的位置)空間不足。不知道你在做什麼,但它必須使用大量的內存。

你可以找出什麼是佔用這麼多的內存,並減少它。或者,你可以 - 如你所說 - 減少併發操作的數量,這可能會使用更少的內存。或者你可以使用類似的東西:

java -Xmx1024M A 

手動指定JVM可用的內存量。但請注意,僅僅增加內存限制而不理解爲什麼它使用這麼多的內存不是一個好主意。我建議首先在這些taskN()調用中尋找一個bug。

+0

謝謝!我會看看。是!每個任務都會花費很多時間,因爲每個任務都會爲每個線程提供300次API。這是我從事多線程工作的原因,因爲單線程花費了大量的時間 – JmG