JUC - ThreadPoolExecutor
ThreadPoolExecutorを作成します。
ThreadPoolExecutor(
int corePoolSize, // 保留在池中的线程数,即使空闲了也保留(除非设置了{@code allowCoreThreadTimeOut})
int maximumPoolSize, // 池中允许的最大线程数
long keepAliveTime, // 当maximumPoolSize>corePoolSize时,多余空闲线程等待任务的时间
TimeUnit unit, // {@code keepAliveTime}参数的时间单位
BlockingQueue<Runnable> workQueue, // 在task执行之前暂存task.队列只接纳被 {@code execute}方法提交的{@code Runnable}task
ThreadFactory threadFactory, // 创建执行task线程的工厂
RejectedExecutionHandler handler // 如果达到线程界限或者队列容量,拒绝任务执行的处理
)
パラメータの制限
- 次のいずれかの条件がスローされ、IllegalArgumentExceptionを
- corePoolSize <0
- keepAliveTimeが<0
- maximumPoolSize <= 0
- maximumPoolSize <corePoolSize
- スローNullPointerExceptionが
- threadFactory == nullを
- 取引== nullを
パラメータサプリメント
- corePoolSize:現在のスレッドの合計数より少ない場合
corePoolSize
、新規であり、コアスレッドを超えた場合、corePoolSize
新しいある非コアスレッド
- keepAliveTimeがは:スレッドプールを指し、非コア糸の長いアイドルタイムアウト、このパラメータの長さが設定されているよりも、それがオフに破壊され、設定した場合
allowCoreThreadTimeOut = true
、上に作用する芯糸
- 単位:TimeUnitで時間
- maximumPoolSize:スレッドの合計数=スレッド+の非コアマルチスレッドコア番号の数
- ワークキュー:コアスレッド場合とき仕事で、新しいタスクを追加するには、処理待ちのキューに追加されますキューがいっぱいの、新しい非中核ラインドライブタスク
- ArrayBlockingQueue:コンストラクタは、サイズを渡す必要があります
- LinkedBlockingQueue:コンストラクタはサイズがデフォルトになります通らない
Integer.MAX_VALUE
ため、このキューに何の上限をメモリの枯渇を引き起こしていない可能性が要求タスクの数が多い、つまり、すべてのコアタスクを超えるスレッドの数がキューに追加されたときに、それはなります。スレッドの合計数がcorePoolSizeを超えることはありませんので、maximumPoolSize障害は、設定につながりました
- SynchronousQueue:同期キュー、キューはストレージスペースをブロックされていない、タスクの同期は、このキューのワーカースレッドに配信されますが、通常、新たに提出拒否無制限maximumPoolSizesタスクを避けるために必要とされます。
- PriorityBlockingQueue:プライオリティキュー
- DelayQueue:タスクに渡す遅延型インタフェースを実装する必要があります。タスクキューを受信すると、第1の第1チームのみが指定された遅延時間に達し、タスクを実行します
- threadFactory:スレッドファクトリ(デフォルト
Executors.defaultThreadFactory()
)
- ハンドラ:拒否ポリシー
- AbortPolicy(デフォルト):直接放棄
- CallerRunsPolicy:、タスクを拒否スレッドプールのスレッドThreadPoolExecutorは実行されませんが、現在のスレッドプールが拒否されたタスクを実行するには、呼び出し元のスレッド
- DiscardOldestPolicy:タスクの最長キュー(タスクの待ち行列に参加する最初の)放棄して、キューに新しいタスクを追加します。
- DiscardPolicy:静かに投げる、拒否されたタスクを破棄していないスレッドプール。
実装プロセス
- 1.スレッドプールがcorePoolSizeよりも少ない場合、この時点で空きスレッド・プールがあっても、タスクを実行する新しいスレッドを作成する新しいタスクを提出します。
- 2.スレッドプールがcorePoolSizeに達すると、新しいタスクを提出するには、ワークキュー、待機中のスレッドプールタスクスケジューリングの実行を配置されます
- フルワークキューとmaximumPoolSize> corePoolSizeが、新たに提出されたタスクは、タスクを実行するために、新しいスレッドを作成し、3。
- 4.タスクの数を提出するとmaximumPoolSizeを超えた場合、のRejectedExecutionHandlerで扱う新しいタスクを提出
- スレッドプールのスレッドがcorePoolSizeアイドル時間を超える5. keepAliveTimeが達すると、アイドル状態のスレッドを閉じ
- (真)allowCoreThreadTimeOutを設定する場合6、corePoolSizeのアイドルスレッドプールスレッドもkeepAliveTimeが閉じ
執行共通ThreadPoolExecutor
- シングルスレッドプール:Executors.newSingleThreadExecutor() || Executors.newSingleThreadExecutor(ThreadFactory threadFactory)
- 新しいThreadPoolExecutor(1、1、
0L、TimeUnit.MILLISECONDS、
新しいLinkedBlockingQueue
())
- 新しいThreadPoolExecutor(1、1、
0L、TimeUnit.MILLISECONDS、
新しいLinkedBlockingQueue
()、
threadFactory)
- 単一のスレッドを作成します。
- 固定线程池:Executors.newFixedThreadPool(int型にnthreads) || Executors.newFixedThreadPool(int型にnthreads、ThreadFactory threadFactory)
- 新しいThreadPoolExecutor(nthreadsの値、nthreadsの値、
0L、TimeUnit.MILLISECONDS、
新しいLinkedBlockingQueue
())
- 新しいThreadPoolExecutor(nthreadsの値、nthreadsの値、
0L、TimeUnit.MILLISECONDS、
新しいLinkedBlockingQueue
()、
threadFactory)。
- 芯糸と最大スレッド同じ、および有効期限はありません。
- キャッシュスレッドプール:Executors.newCachedThreadPool() || Executors.newCachedThreadPool(ThreadFactory threadFactory)
- 新しいThreadPoolExecutor(0、Integer.MAX_VALUEで、
60L、TimeUnit.SECONDS、
新しいSynchronousQueue
())
- 新しいThreadPoolExecutor(0、Integer.MAX_VALUEで、
60L、TimeUnit.SECONDS、
新しいSynchronousQueue
()、
threadFactory)
- コアスレッドはゼロであり、キューは、スレッド、デフォルトの有効期限の60年代を作成するために必要な、SynchronousQueueをブロックされています
- 调度线程池:Executors.newScheduledThreadPool(int型corePoolSize) || Executors.newScheduledThreadPool(int型corePoolSize、ThreadFactory threadFactory)
- 新しいThreadPoolExecutor(corePoolSize、Integer.MAX_VALUEで、
0、TimeUnit.NANOSECONDS、
新しいDelayedWorkQueue())
- 新しいThreadPoolExecutor(corePoolSize、Integer.MAX_VALUEで、
0、TimeUnit.NANOSECONDS、
新しいDelayedWorkQueue()、
threadFactory)
- またはスケジューリングコマンドは、定期的な実行に指定された遅延時間を実行することができます
- スレッドプールを盗む:Executors.newWorkStealingPool() || Executors.newWorkStealingPool(int型の並列処理)
- 新しいForkJoinPool
(Runtime.getRuntime()availableProcessors()、。
ForkJoinPool.defaultForkJoinWorkerThreadFactory、
ヌル、真の);
- 新しいForkJoinPool
(並列処理、
ForkJoinPool.defaultForkJoinWorkerThreadFactory、
ヌル、真)
- スレッドがのForkJoinPoolを拡大している盗む(分割統治法)、タスクキューのスレッドプールを作成するよりもして、あなたがのためにパラレル、時間のかかるタスクで実行するスレッドのCPU番号を作成するために、現在利用可能な接続の数を減らすことができます
参考読書