2011-07-31 15 views
0

スレッドをオーバースピンするときに問題を解決できるExecutors.newCachedThreadPool()を使用することをお勧めしました。エグゼキュータを使用してもスレッドを開始できません

スレッドの数が一定のポイントを超えて増加しても、まだエラーがあります。システムリソースが利用可能になるのを待っている間にスレッドが待機するのを許可する方法はありますか?

[WARN ] Thread table can't grow past 16383 threads. 

[ERROR][thread ] Could not start thread pool-1-thread-16114. errorcode -1 
Exception in thread "Main Thread" java.lang.Error: errorcode -1 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:640) 
    at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727) 
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657) 
    at sg.java.executors_helloworld.App.main(App.java:15) 

public class App { 
    public static void main(String args[]) { 
     ExecutorService es = Executors.newCachedThreadPool(); 

     long time = System.currentTimeMillis(); 

     for (int i = 0; i < 1000000; i++) { 
      es.execute(new Car()); 
     } 

     long completedIn = System.currentTimeMillis() - time; 

     System.out.println(DurationFormatUtils.formatDuration(completedIn, 
       "HH:mm:ss:SS")); 
    } 
} 



public class Car implements Runnable { 
    public void run() { 
     System.out.println("Car <" + Thread.currentThread().getName() 
       + "> doing something"); 

     try { 
      Thread.sleep(10 * 1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+1

各スレッドはスタック領域を使用して、あなたはスタック領域が不足したときに、あなたがより多くのスレッドを作成することはできません。キャッシュされたプールはすべてのタスク用のスレッドを作成しますが、CPUを使用しない、つまりすべての時間を費やすタスクがたくさんある場合を除いて、スレッド数をいくつかのコア数。例えば4,8,16。 –

答えて

4

まあ、newCachedThreadPool

は、必要に応じて新しいスレッドを作成するスレッドプールを作成しますが、彼らが用意されていたときに、以前に構築されたスレッドを再利用します。

あなたは最大サイズとプールを望むように聞こえます。たとえば、次のように一度に最大50個のスレッドを使用します

ExecutorService es = Executors.newFixedThreadPool(50); 

。 (50がうまくもちろん、あなたのための右の数ではないかもしれない - 。それはあなたが何をやっているによって異なります)

+0

ありがとうございました。 –

+0

これは50スレッドを使用することになります。現在の標準ライブラリでは、最大サイズよりもコアサイズが小さいプールを取得するのは実際には非常に困難です。 –

関連する問題