2017-05-10 13 views

答えて

0

すべてのリソースを消費するのかどうかはわかりませんが、無制限です(Integer.MAX_VALUEスレッドをスピンアップできない限り)。可能であれば、スレッドを再利用し、未使用のスレッドを削除します。あなたは、単にコンストラクタを自分で使用することができますしかし:

ExecutorService myPool = new ThreadPoolExecutor(0, 30, //30 thread cap 
     60L, TimeUnit.SECONDS, //thread expiration time 
     new LinkedBlockingDeque<>(), //infinite queue, can use other synchronous collections 
     r -> new Thread(r, /* thread name */)); //thread factory 
0

newCachedThreadPool背後にある考え方は同じではなく、新しいスレッドを作成する再利用できるように短命のスレッドを作成することです。

スレッドの数がInteger.MAX_VALUEに相当するシナリオがあるとします。まだ使用可能なCPUコアの数は、下記のコードを1として4

を言うことになります。

public static ExecutorService newCachedThreadPool() { 
     return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 
             60L, TimeUnit.SECONDS, 
             new SynchronousQueue<Runnable>()); 
} 

newCachedThreadPool()方法は、内部Integer.MAX_VALUEとしてmaximumPoolSizeと60secondなどkeepAlive時間で新しいThreadPoolExecutorを作成します。

keepAliveのjavadocが示唆:スレッドの数がコアよりも多い場合

keepAliveTimeが、これは超過したアイドル状態のスレッドが終了する前に新しいタスクを待機する最大時間です。スレッドの数が使用可能なCPUコア以上であれば、余分なスレッドが終了とマークされる前にのみ60secsのためにライブになることを意味し

したがって、newCachedThreadPool()がシステムリソースを完全に消費させるようなシナリオはありません。

関連する問題