待ち時間がkeepAliveTimeがスレッドが次に削除されます超過した場合keepAliveTimeがパラメータは、主にコアスレッド他のスレッドに加えている次のスレッドは、時間を待って操作を実行するために作成された方法に焦点を当て、スレッドプールの2つのコアのパラメータを導入削除する方法です
- HashSetの労働者労働者階級のコレクション
実際には労働者が、これはスレッドプールのスレッドが10ワーカーカテゴリを作成するために、10を開く際に、Runnableインタフェースを実現するために、スレッドプールのスレッドに保存されている二つの主要な炉心パラメータを実行するクラスのコレクションワーカークラスを作業これらの労働者の労働者に保存されます
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
{
/** 执行Worker的线程 */
final Thread thread;
/** 这里存放的是使用方传给线程池的线程 */
Runnable firstTask;
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
// 把自己本身worker放入到thread中 后面直接执行thread.start 就会执行Worker的run方法 然后在run方法中执行firstTask.run
this.thread = getThreadFactory().newThread(this);
}
复制代码
- BlockingQueueの<Runnableを>ワークキューキュー
キューが実際にある場合は、スレッドは、スレッドのコア数が実行されるのを待って、実行待ちキューに入れられます達します
(Runnableをコマンド)を実行
コアスレッドの数が0を除くもちろん、コアへのスレッドのコード番号を実行するよりも、スレッドの現在の数が少ないため、実行スレッドの最初のプールを実行すると
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
复制代码
実行されるスレッドの命令だけで労働者階級に労働者を配置し、コレクション内の労働者の労働者階級に配置し、ワーカースレッドを開始するために言ったときにここでは、この方法の核心は、渡さaddWorkerますされます
//只拉取核心代码
// firstTask为execute(Runnable command)传入的需要执行的线程
w = new Worker(firstTask);
final Thread t = w.thread;
workers.add(w);
t.start();
复制代码
労働者runWorker実行方法と実行スレッドがここで実行する必要があるの内側にrunメソッドが最初になります後、主にメソッドのコードのコアは2を持っています
//task为前面execute(Runnable command)传入的需要执行的线程 如果不为空则执行执行task.run 如果为空 则通过getTask() 获取等待队列workQueue里需要执行的线程
while (task != null || (task = getTask()) != null)
复制代码
これは、コアフォーカスkeepAliveTimeがさgetTask()メソッドを反映します
現在、スレッドを実行すると、コアスレッドが= falseを計時されています
//只拉取核心代码
Runnable r = timed ?
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
workQueue.take();
复制代码
workQueue.takeは()買収はスレッドタスクをブロックされるまでのBlockingQueue <Runnableを>ワークキューキュースレッドがブロックされている場合は、タスクを実行する必要はありませんが、お待ちしておりますので、スレッドは待ちキューからタスクを実行する必要があります取得を実行
workQueue.take();
复制代码
workQueue.poll(keepAliveTimeが、TimeUnit.NANOSECONDS)の実施に関する時限=真の焦点の場合:keepAliveTimeが役割を果たしていることをここにあります
この世論調査は、長いタイムアウトがnullを返すよりも設定されているコードのkeepAliveTimeがラインをお待ちしております
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
复制代码
タイムアウト時間getTaskはNULLが返されます場合には
while (task != null || (task = getTask()) != null)
复制代码
起動サイクルとセット
completedAbruptly = false;
复制代码
そして、processWorkerExitメソッドを実行
processWorkerExit(w, completedAbruptly)
复制代码
processWorkerExitこのコアは、現在、労働者階級の労働者セットから削除労働者を実行しています
workers.remove(w);
复制代码
そして、いくつかのロジックがあります
if (!completedAbruptly) {
//allowCoreThreadTimeOut默认为false 如果设置为true 则代表线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭 上面说的timed 如果allowCoreThreadTimeOut为true 则timed也会为true 也就会进入poll方法 通过这个来实现超时关闭核心线程数
int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
if (min == 0 && ! workQueue.isEmpty())
min = 1;
//当前线程数大于核心线程数 直接返回 然后线程关闭
if (workerCountOf(c) >= min)
return; // replacement not needed
}
addWorker(null, false);
复制代码
実際には、このノートは異常がcompletedAbruptly = trueの場合、addWorkerを(ヌル、false)を実行するコードの上に行く場合は、独自のRunnableコマンドを記述するために開始runメソッドを実行し、その点の最適化の点である、上記addWorkerは(ヌル、false)のことに注意してください。続けるには、空のワーカースレッドを作成