ThreadPoolExecutorスレッドプールの元通訳アイドル時間期限切れの役割keepAliveTimeが

待ち時間がkeepAliveTimeがスレッドが次に削除されます超過した場合keepAliveTimeがパラメータは、主にコアスレッド他のスレッドに加えている次のスレッドは、時間を待って操作を実行するために作成された方法に焦点を当て、スレッドプールの2つのコアのパラメータを導入削除する方法です

  1. 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);
        }
复制代码
  1. 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)のことに注意してください。続けるには、空のワーカースレッドを作成

フォーカス:だからここですべての例外ではなく、すぐにスレッドを破棄し、新しいスレッドプールのスレッドは何の効果もないでしょう作成することになりそうにスローされる例外を投げるのキャプチャを実行するのが最適です

おすすめ

転載: juejin.im/post/5d563958e51d4561b416d45b
おすすめ