Home | History | Annotate | Download | only in concurrent
      1 /*
      2  * Written by Doug Lea with assistance from members of JCP JSR-166
      3  * Expert Group and released to the public domain, as explained at
      4  * http://creativecommons.org/publicdomain/zero/1.0/
      5  */
      6 
      7 package java.util.concurrent;
      8 
      9 import java.util.concurrent.locks.AbstractQueuedSynchronizer;
     10 import java.util.concurrent.locks.Condition;
     11 import java.util.concurrent.locks.ReentrantLock;
     12 import java.util.concurrent.atomic.AtomicInteger;
     13 import java.util.*;
     14 
     15 // BEGIN android-note
     16 // removed security manager docs
     17 // END android-note
     18 
     19 /**
     20  * An {@link ExecutorService} that executes each submitted task using
     21  * one of possibly several pooled threads, normally configured
     22  * using {@link Executors} factory methods.
     23  *
     24  * <p>Thread pools address two different problems: they usually
     25  * provide improved performance when executing large numbers of
     26  * asynchronous tasks, due to reduced per-task invocation overhead,
     27  * and they provide a means of bounding and managing the resources,
     28  * including threads, consumed when executing a collection of tasks.
     29  * Each {@code ThreadPoolExecutor} also maintains some basic
     30  * statistics, such as the number of completed tasks.
     31  *
     32  * <p>To be useful across a wide range of contexts, this class
     33  * provides many adjustable parameters and extensibility
     34  * hooks. However, programmers are urged to use the more convenient
     35  * {@link Executors} factory methods {@link
     36  * Executors#newCachedThreadPool} (unbounded thread pool, with
     37  * automatic thread reclamation), {@link Executors#newFixedThreadPool}
     38  * (fixed size thread pool) and {@link
     39  * Executors#newSingleThreadExecutor} (single background thread), that
     40  * preconfigure settings for the most common usage
     41  * scenarios. Otherwise, use the following guide when manually
     42  * configuring and tuning this class:
     43  *
     44  * <dl>
     45  *
     46  * <dt>Core and maximum pool sizes</dt>
     47  *
     48  * <dd>A {@code ThreadPoolExecutor} will automatically adjust the
     49  * pool size (see {@link #getPoolSize})
     50  * according to the bounds set by
     51  * corePoolSize (see {@link #getCorePoolSize}) and
     52  * maximumPoolSize (see {@link #getMaximumPoolSize}).
     53  *
     54  * When a new task is submitted in method {@link #execute(Runnable)},
     55  * and fewer than corePoolSize threads are running, a new thread is
     56  * created to handle the request, even if other worker threads are
     57  * idle.  If there are more than corePoolSize but less than
     58  * maximumPoolSize threads running, a new thread will be created only
     59  * if the queue is full.  By setting corePoolSize and maximumPoolSize
     60  * the same, you create a fixed-size thread pool. By setting
     61  * maximumPoolSize to an essentially unbounded value such as {@code
     62  * Integer.MAX_VALUE}, you allow the pool to accommodate an arbitrary
     63  * number of concurrent tasks. Most typically, core and maximum pool
     64  * sizes are set only upon construction, but they may also be changed
     65  * dynamically using {@link #setCorePoolSize} and {@link
     66  * #setMaximumPoolSize}. </dd>
     67  *
     68  * <dt>On-demand construction</dt>
     69  *
     70  * <dd>By default, even core threads are initially created and
     71  * started only when new tasks arrive, but this can be overridden
     72  * dynamically using method {@link #prestartCoreThread} or {@link
     73  * #prestartAllCoreThreads}.  You probably want to prestart threads if
     74  * you construct the pool with a non-empty queue. </dd>
     75  *
     76  * <dt>Creating new threads</dt>
     77  *
     78  * <dd>New threads are created using a {@link ThreadFactory}.  If not
     79  * otherwise specified, a {@link Executors#defaultThreadFactory} is
     80  * used, that creates threads to all be in the same {@link
     81  * ThreadGroup} and with the same {@code NORM_PRIORITY} priority and
     82  * non-daemon status. By supplying a different ThreadFactory, you can
     83  * alter the thread's name, thread group, priority, daemon status,
     84  * etc. If a {@code ThreadFactory} fails to create a thread when asked
     85  * by returning null from {@code newThread}, the executor will
     86  * continue, but might not be able to execute any tasks.</dd>
     87  *
     88  * <dt>Keep-alive times</dt>
     89  *
     90  * <dd>If the pool currently has more than corePoolSize threads,
     91  * excess threads will be terminated if they have been idle for more
     92  * than the keepAliveTime (see {@link #getKeepAliveTime(TimeUnit)}).
     93  * This provides a means of reducing resource consumption when the
     94  * pool is not being actively used. If the pool becomes more active
     95  * later, new threads will be constructed. This parameter can also be
     96  * changed dynamically using method {@link #setKeepAliveTime(long,
     97  * TimeUnit)}.  Using a value of {@code Long.MAX_VALUE} {@link
     98  * TimeUnit#NANOSECONDS} effectively disables idle threads from ever
     99  * terminating prior to shut down. By default, the keep-alive policy
    100  * applies only when there are more than corePoolSize threads. But
    101  * method {@link #allowCoreThreadTimeOut(boolean)} can be used to
    102  * apply this time-out policy to core threads as well, so long as the
    103  * keepAliveTime value is non-zero. </dd>
    104  *
    105  * <dt>Queuing</dt>
    106  *
    107  * <dd>Any {@link BlockingQueue} may be used to transfer and hold
    108  * submitted tasks.  The use of this queue interacts with pool sizing:
    109  *
    110  * <ul>
    111  *
    112  * <li> If fewer than corePoolSize threads are running, the Executor
    113  * always prefers adding a new thread
    114  * rather than queuing.</li>
    115  *
    116  * <li> If corePoolSize or more threads are running, the Executor
    117  * always prefers queuing a request rather than adding a new
    118  * thread.</li>
    119  *
    120  * <li> If a request cannot be queued, a new thread is created unless
    121  * this would exceed maximumPoolSize, in which case, the task will be
    122  * rejected.</li>
    123  *
    124  * </ul>
    125  *
    126  * There are three general strategies for queuing:
    127  * <ol>
    128  *
    129  * <li> <em> Direct handoffs.</em> A good default choice for a work
    130  * queue is a {@link SynchronousQueue} that hands off tasks to threads
    131  * without otherwise holding them. Here, an attempt to queue a task
    132  * will fail if no threads are immediately available to run it, so a
    133  * new thread will be constructed. This policy avoids lockups when
    134  * handling sets of requests that might have internal dependencies.
    135  * Direct handoffs generally require unbounded maximumPoolSizes to
    136  * avoid rejection of new submitted tasks. This in turn admits the
    137  * possibility of unbounded thread growth when commands continue to
    138  * arrive on average faster than they can be processed.  </li>
    139  *
    140  * <li><em> Unbounded queues.</em> Using an unbounded queue (for
    141  * example a {@link LinkedBlockingQueue} without a predefined
    142  * capacity) will cause new tasks to wait in the queue when all
    143  * corePoolSize threads are busy. Thus, no more than corePoolSize
    144  * threads will ever be created. (And the value of the maximumPoolSize
    145  * therefore doesn't have any effect.)  This may be appropriate when
    146  * each task is completely independent of others, so tasks cannot
    147  * affect each others execution; for example, in a web page server.
    148  * While this style of queuing can be useful in smoothing out
    149  * transient bursts of requests, it admits the possibility of
    150  * unbounded work queue growth when commands continue to arrive on
    151  * average faster than they can be processed.  </li>
    152  *
    153  * <li><em>Bounded queues.</em> A bounded queue (for example, an
    154  * {@link ArrayBlockingQueue}) helps prevent resource exhaustion when
    155  * used with finite maximumPoolSizes, but can be more difficult to
    156  * tune and control.  Queue sizes and maximum pool sizes may be traded
    157  * off for each other: Using large queues and small pools minimizes
    158  * CPU usage, OS resources, and context-switching overhead, but can
    159  * lead to artificially low throughput.  If tasks frequently block (for
    160  * example if they are I/O bound), a system may be able to schedule
    161  * time for more threads than you otherwise allow. Use of small queues
    162  * generally requires larger pool sizes, which keeps CPUs busier but
    163  * may encounter unacceptable scheduling overhead, which also
    164  * decreases throughput.  </li>
    165  *
    166  * </ol>
    167  *
    168  * </dd>
    169  *
    170  * <dt>Rejected tasks</dt>
    171  *
    172  * <dd>New tasks submitted in method {@link #execute(Runnable)} will be
    173  * <em>rejected</em> when the Executor has been shut down, and also when
    174  * the Executor uses finite bounds for both maximum threads and work queue
    175  * capacity, and is saturated.  In either case, the {@code execute} method
    176  * invokes the {@link
    177  * RejectedExecutionHandler#rejectedExecution(Runnable, ThreadPoolExecutor)}
    178  * method of its {@link RejectedExecutionHandler}.  Four predefined handler
    179  * policies are provided:
    180  *
    181  * <ol>
    182  *
    183  * <li> In the default {@link ThreadPoolExecutor.AbortPolicy}, the
    184  * handler throws a runtime {@link RejectedExecutionException} upon
    185  * rejection. </li>
    186  *
    187  * <li> In {@link ThreadPoolExecutor.CallerRunsPolicy}, the thread
    188  * that invokes {@code execute} itself runs the task. This provides a
    189  * simple feedback control mechanism that will slow down the rate that
    190  * new tasks are submitted. </li>
    191  *
    192  * <li> In {@link ThreadPoolExecutor.DiscardPolicy}, a task that
    193  * cannot be executed is simply dropped.  </li>
    194  *
    195  * <li>In {@link ThreadPoolExecutor.DiscardOldestPolicy}, if the
    196  * executor is not shut down, the task at the head of the work queue
    197  * is dropped, and then execution is retried (which can fail again,
    198  * causing this to be repeated.) </li>
    199  *
    200  * </ol>
    201  *
    202  * It is possible to define and use other kinds of {@link
    203  * RejectedExecutionHandler} classes. Doing so requires some care
    204  * especially when policies are designed to work only under particular
    205  * capacity or queuing policies. </dd>
    206  *
    207  * <dt>Hook methods</dt>
    208  *
    209  * <dd>This class provides {@code protected} overridable
    210  * {@link #beforeExecute(Thread, Runnable)} and
    211  * {@link #afterExecute(Runnable, Throwable)} methods that are called
    212  * before and after execution of each task.  These can be used to
    213  * manipulate the execution environment; for example, reinitializing
    214  * ThreadLocals, gathering statistics, or adding log entries.
    215  * Additionally, method {@link #terminated} can be overridden to perform
    216  * any special processing that needs to be done once the Executor has
    217  * fully terminated.
    218  *
    219  * <p>If hook or callback methods throw exceptions, internal worker
    220  * threads may in turn fail and abruptly terminate.</dd>
    221  *
    222  * <dt>Queue maintenance</dt>
    223  *
    224  * <dd>Method {@link #getQueue()} allows access to the work queue
    225  * for purposes of monitoring and debugging.  Use of this method for
    226  * any other purpose is strongly discouraged.  Two supplied methods,
    227  * {@link #remove(Runnable)} and {@link #purge} are available to
    228  * assist in storage reclamation when large numbers of queued tasks
    229  * become cancelled.</dd>
    230  *
    231  * <dt>Finalization</dt>
    232  *
    233  * <dd>A pool that is no longer referenced in a program <em>AND</em>
    234  * has no remaining threads will be {@code shutdown} automatically. If
    235  * you would like to ensure that unreferenced pools are reclaimed even
    236  * if users forget to call {@link #shutdown}, then you must arrange
    237  * that unused threads eventually die, by setting appropriate
    238  * keep-alive times, using a lower bound of zero core threads and/or
    239  * setting {@link #allowCoreThreadTimeOut(boolean)}.  </dd>
    240  *
    241  * </dl>
    242  *
    243  * <p><b>Extension example</b>. Most extensions of this class
    244  * override one or more of the protected hook methods. For example,
    245  * here is a subclass that adds a simple pause/resume feature:
    246  *
    247  *  <pre> {@code
    248  * class PausableThreadPoolExecutor extends ThreadPoolExecutor {
    249  *   private boolean isPaused;
    250  *   private ReentrantLock pauseLock = new ReentrantLock();
    251  *   private Condition unpaused = pauseLock.newCondition();
    252  *
    253  *   public PausableThreadPoolExecutor(...) { super(...); }
    254  *
    255  *   protected void beforeExecute(Thread t, Runnable r) {
    256  *     super.beforeExecute(t, r);
    257  *     pauseLock.lock();
    258  *     try {
    259  *       while (isPaused) unpaused.await();
    260  *     } catch (InterruptedException ie) {
    261  *       t.interrupt();
    262  *     } finally {
    263  *       pauseLock.unlock();
    264  *     }
    265  *   }
    266  *
    267  *   public void pause() {
    268  *     pauseLock.lock();
    269  *     try {
    270  *       isPaused = true;
    271  *     } finally {
    272  *       pauseLock.unlock();
    273  *     }
    274  *   }
    275  *
    276  *   public void resume() {
    277  *     pauseLock.lock();
    278  *     try {
    279  *       isPaused = false;
    280  *       unpaused.signalAll();
    281  *     } finally {
    282  *       pauseLock.unlock();
    283  *     }
    284  *   }
    285  * }}</pre>
    286  *
    287  * @since 1.5
    288  * @author Doug Lea
    289  */
    290 public class ThreadPoolExecutor extends AbstractExecutorService {
    291     /**
    292      * The main pool control state, ctl, is an atomic integer packing
    293      * two conceptual fields
    294      *   workerCount, indicating the effective number of threads
    295      *   runState,    indicating whether running, shutting down etc
    296      *
    297      * In order to pack them into one int, we limit workerCount to
    298      * (2^29)-1 (about 500 million) threads rather than (2^31)-1 (2
    299      * billion) otherwise representable. If this is ever an issue in
    300      * the future, the variable can be changed to be an AtomicLong,
    301      * and the shift/mask constants below adjusted. But until the need
    302      * arises, this code is a bit faster and simpler using an int.
    303      *
    304      * The workerCount is the number of workers that have been
    305      * permitted to start and not permitted to stop.  The value may be
    306      * transiently different from the actual number of live threads,
    307      * for example when a ThreadFactory fails to create a thread when
    308      * asked, and when exiting threads are still performing
    309      * bookkeeping before terminating. The user-visible pool size is
    310      * reported as the current size of the workers set.
    311      *
    312      * The runState provides the main lifecycle control, taking on values:
    313      *
    314      *   RUNNING:  Accept new tasks and process queued tasks
    315      *   SHUTDOWN: Don't accept new tasks, but process queued tasks
    316      *   STOP:     Don't accept new tasks, don't process queued tasks,
    317      *             and interrupt in-progress tasks
    318      *   TIDYING:  All tasks have terminated, workerCount is zero,
    319      *             the thread transitioning to state TIDYING
    320      *             will run the terminated() hook method
    321      *   TERMINATED: terminated() has completed
    322      *
    323      * The numerical order among these values matters, to allow
    324      * ordered comparisons. The runState monotonically increases over
    325      * time, but need not hit each state. The transitions are:
    326      *
    327      * RUNNING -> SHUTDOWN
    328      *    On invocation of shutdown(), perhaps implicitly in finalize()
    329      * (RUNNING or SHUTDOWN) -> STOP
    330      *    On invocation of shutdownNow()
    331      * SHUTDOWN -> TIDYING
    332      *    When both queue and pool are empty
    333      * STOP -> TIDYING
    334      *    When pool is empty
    335      * TIDYING -> TERMINATED
    336      *    When the terminated() hook method has completed
    337      *
    338      * Threads waiting in awaitTermination() will return when the
    339      * state reaches TERMINATED.
    340      *
    341      * Detecting the transition from SHUTDOWN to TIDYING is less
    342      * straightforward than you'd like because the queue may become
    343      * empty after non-empty and vice versa during SHUTDOWN state, but
    344      * we can only terminate if, after seeing that it is empty, we see
    345      * that workerCount is 0 (which sometimes entails a recheck -- see
    346      * below).
    347      */
    348     private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    349     private static final int COUNT_BITS = Integer.SIZE - 3;
    350     private static final int CAPACITY   = (1 << COUNT_BITS) - 1;
    351 
    352     // runState is stored in the high-order bits
    353     private static final int RUNNING    = -1 << COUNT_BITS;
    354     private static final int SHUTDOWN   =  0 << COUNT_BITS;
    355     private static final int STOP       =  1 << COUNT_BITS;
    356     private static final int TIDYING    =  2 << COUNT_BITS;
    357     private static final int TERMINATED =  3 << COUNT_BITS;
    358 
    359     // Packing and unpacking ctl
    360     private static int runStateOf(int c)     { return c & ~CAPACITY; }
    361     private static int workerCountOf(int c)  { return c & CAPACITY; }
    362     private static int ctlOf(int rs, int wc) { return rs | wc; }
    363 
    364     /*
    365      * Bit field accessors that don't require unpacking ctl.
    366      * These depend on the bit layout and on workerCount being never negative.
    367      */
    368 
    369     private static boolean runStateLessThan(int c, int s) {
    370         return c < s;
    371     }
    372 
    373     private static boolean runStateAtLeast(int c, int s) {
    374         return c >= s;
    375     }
    376 
    377     private static boolean isRunning(int c) {
    378         return c < SHUTDOWN;
    379     }
    380 
    381     /**
    382      * Attempts to CAS-increment the workerCount field of ctl.
    383      */
    384     private boolean compareAndIncrementWorkerCount(int expect) {
    385         return ctl.compareAndSet(expect, expect + 1);
    386     }
    387 
    388     /**
    389      * Attempts to CAS-decrement the workerCount field of ctl.
    390      */
    391     private boolean compareAndDecrementWorkerCount(int expect) {
    392         return ctl.compareAndSet(expect, expect - 1);
    393     }
    394 
    395     /**
    396      * Decrements the workerCount field of ctl. This is called only on
    397      * abrupt termination of a thread (see processWorkerExit). Other
    398      * decrements are performed within getTask.
    399      */
    400     private void decrementWorkerCount() {
    401         do {} while (! compareAndDecrementWorkerCount(ctl.get()));
    402     }
    403 
    404     /**
    405      * The queue used for holding tasks and handing off to worker
    406      * threads.  We do not require that workQueue.poll() returning
    407      * null necessarily means that workQueue.isEmpty(), so rely
    408      * solely on isEmpty to see if the queue is empty (which we must
    409      * do for example when deciding whether to transition from
    410      * SHUTDOWN to TIDYING).  This accommodates special-purpose
    411      * queues such as DelayQueues for which poll() is allowed to
    412      * return null even if it may later return non-null when delays
    413      * expire.
    414      */
    415     private final BlockingQueue<Runnable> workQueue;
    416 
    417     /**
    418      * Lock held on access to workers set and related bookkeeping.
    419      * While we could use a concurrent set of some sort, it turns out
    420      * to be generally preferable to use a lock. Among the reasons is
    421      * that this serializes interruptIdleWorkers, which avoids
    422      * unnecessary interrupt storms, especially during shutdown.
    423      * Otherwise exiting threads would concurrently interrupt those
    424      * that have not yet interrupted. It also simplifies some of the
    425      * associated statistics bookkeeping of largestPoolSize etc. We
    426      * also hold mainLock on shutdown and shutdownNow, for the sake of
    427      * ensuring workers set is stable while separately checking
    428      * permission to interrupt and actually interrupting.
    429      */
    430     private final ReentrantLock mainLock = new ReentrantLock();
    431 
    432     /**
    433      * Set containing all worker threads in pool. Accessed only when
    434      * holding mainLock.
    435      */
    436     private final HashSet<Worker> workers = new HashSet<Worker>();
    437 
    438     /**
    439      * Wait condition to support awaitTermination
    440      */
    441     private final Condition termination = mainLock.newCondition();
    442 
    443     /**
    444      * Tracks largest attained pool size. Accessed only under
    445      * mainLock.
    446      */
    447     private int largestPoolSize;
    448 
    449     /**
    450      * Counter for completed tasks. Updated only on termination of
    451      * worker threads. Accessed only under mainLock.
    452      */
    453     private long completedTaskCount;
    454 
    455     /*
    456      * All user control parameters are declared as volatiles so that
    457      * ongoing actions are based on freshest values, but without need
    458      * for locking, since no internal invariants depend on them
    459      * changing synchronously with respect to other actions.
    460      */
    461 
    462     /**
    463      * Factory for new threads. All threads are created using this
    464      * factory (via method addWorker).  All callers must be prepared
    465      * for addWorker to fail, which may reflect a system or user's
    466      * policy limiting the number of threads.  Even though it is not
    467      * treated as an error, failure to create threads may result in
    468      * new tasks being rejected or existing ones remaining stuck in
    469      * the queue.
    470      *
    471      * We go further and preserve pool invariants even in the face of
    472      * errors such as OutOfMemoryError, that might be thrown while
    473      * trying to create threads.  Such errors are rather common due to
    474      * the need to allocate a native stack in Thread.start, and users
    475      * will want to perform clean pool shutdown to clean up.  There
    476      * will likely be enough memory available for the cleanup code to
    477      * complete without encountering yet another OutOfMemoryError.
    478      */
    479     private volatile ThreadFactory threadFactory;
    480 
    481     /**
    482      * Handler called when saturated or shutdown in execute.
    483      */
    484     private volatile RejectedExecutionHandler handler;
    485 
    486     /**
    487      * Timeout in nanoseconds for idle threads waiting for work.
    488      * Threads use this timeout when there are more than corePoolSize
    489      * present or if allowCoreThreadTimeOut. Otherwise they wait
    490      * forever for new work.
    491      */
    492     private volatile long keepAliveTime;
    493 
    494     /**
    495      * If false (default), core threads stay alive even when idle.
    496      * If true, core threads use keepAliveTime to time out waiting
    497      * for work.
    498      */
    499     private volatile boolean allowCoreThreadTimeOut;
    500 
    501     /**
    502      * Core pool size is the minimum number of workers to keep alive
    503      * (and not allow to time out etc) unless allowCoreThreadTimeOut
    504      * is set, in which case the minimum is zero.
    505      */
    506     private volatile int corePoolSize;
    507 
    508     /**
    509      * Maximum pool size. Note that the actual maximum is internally
    510      * bounded by CAPACITY.
    511      */
    512     private volatile int maximumPoolSize;
    513 
    514     /**
    515      * The default rejected execution handler
    516      */
    517     private static final RejectedExecutionHandler defaultHandler =
    518         new AbortPolicy();
    519 
    520     /**
    521      * Permission required for callers of shutdown and shutdownNow.
    522      * We additionally require (see checkShutdownAccess) that callers
    523      * have permission to actually interrupt threads in the worker set
    524      * (as governed by Thread.interrupt, which relies on
    525      * ThreadGroup.checkAccess, which in turn relies on
    526      * SecurityManager.checkAccess). Shutdowns are attempted only if
    527      * these checks pass.
    528      *
    529      * All actual invocations of Thread.interrupt (see
    530      * interruptIdleWorkers and interruptWorkers) ignore
    531      * SecurityExceptions, meaning that the attempted interrupts
    532      * silently fail. In the case of shutdown, they should not fail
    533      * unless the SecurityManager has inconsistent policies, sometimes
    534      * allowing access to a thread and sometimes not. In such cases,
    535      * failure to actually interrupt threads may disable or delay full
    536      * termination. Other uses of interruptIdleWorkers are advisory,
    537      * and failure to actually interrupt will merely delay response to
    538      * configuration changes so is not handled exceptionally.
    539      */
    540     private static final RuntimePermission shutdownPerm =
    541         new RuntimePermission("modifyThread");
    542 
    543     /**
    544      * Class Worker mainly maintains interrupt control state for
    545      * threads running tasks, along with other minor bookkeeping.
    546      * This class opportunistically extends AbstractQueuedSynchronizer
    547      * to simplify acquiring and releasing a lock surrounding each
    548      * task execution.  This protects against interrupts that are
    549      * intended to wake up a worker thread waiting for a task from
    550      * instead interrupting a task being run.  We implement a simple
    551      * non-reentrant mutual exclusion lock rather than use
    552      * ReentrantLock because we do not want worker tasks to be able to
    553      * reacquire the lock when they invoke pool control methods like
    554      * setCorePoolSize.  Additionally, to suppress interrupts until
    555      * the thread actually starts running tasks, we initialize lock
    556      * state to a negative value, and clear it upon start (in
    557      * runWorker).
    558      */
    559     private final class Worker
    560         extends AbstractQueuedSynchronizer
    561         implements Runnable
    562     {
    563         /**
    564          * This class will never be serialized, but we provide a
    565          * serialVersionUID to suppress a javac warning.
    566          */
    567         private static final long serialVersionUID = 6138294804551838833L;
    568 
    569         /** Thread this worker is running in.  Null if factory fails. */
    570         final Thread thread;
    571         /** Initial task to run.  Possibly null. */
    572         Runnable firstTask;
    573         /** Per-thread task counter */
    574         volatile long completedTasks;
    575 
    576         /**
    577          * Creates with given first task and thread from ThreadFactory.
    578          * @param firstTask the first task (null if none)
    579          */
    580         Worker(Runnable firstTask) {
    581             setState(-1); // inhibit interrupts until runWorker
    582             this.firstTask = firstTask;
    583             this.thread = getThreadFactory().newThread(this);
    584         }
    585 
    586         /** Delegates main run loop to outer runWorker. */
    587         public void run() {
    588             runWorker(this);
    589         }
    590 
    591         // Lock methods
    592         //
    593         // The value 0 represents the unlocked state.
    594         // The value 1 represents the locked state.
    595 
    596         protected boolean isHeldExclusively() {
    597             return getState() != 0;
    598         }
    599 
    600         protected boolean tryAcquire(int unused) {
    601             if (compareAndSetState(0, 1)) {
    602                 setExclusiveOwnerThread(Thread.currentThread());
    603                 return true;
    604             }
    605             return false;
    606         }
    607 
    608         protected boolean tryRelease(int unused) {
    609             setExclusiveOwnerThread(null);
    610             setState(0);
    611             return true;
    612         }
    613 
    614         public void lock()        { acquire(1); }
    615         public boolean tryLock()  { return tryAcquire(1); }
    616         public void unlock()      { release(1); }
    617         public boolean isLocked() { return isHeldExclusively(); }
    618 
    619         void interruptIfStarted() {
    620             Thread t;
    621             if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
    622                 try {
    623                     t.interrupt();
    624                 } catch (SecurityException ignore) {
    625                 }
    626             }
    627         }
    628     }
    629 
    630     /*
    631      * Methods for setting control state
    632      */
    633 
    634     /**
    635      * Transitions runState to given target, or leaves it alone if
    636      * already at least the given target.
    637      *
    638      * @param targetState the desired state, either SHUTDOWN or STOP
    639      *        (but not TIDYING or TERMINATED -- use tryTerminate for that)
    640      */
    641     private void advanceRunState(int targetState) {
    642         for (;;) {
    643             int c = ctl.get();
    644             if (runStateAtLeast(c, targetState) ||
    645                 ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))))
    646                 break;
    647         }
    648     }
    649 
    650     /**
    651      * Transitions to TERMINATED state if either (SHUTDOWN and pool
    652      * and queue empty) or (STOP and pool empty).  If otherwise
    653      * eligible to terminate but workerCount is nonzero, interrupts an
    654      * idle worker to ensure that shutdown signals propagate. This
    655      * method must be called following any action that might make
    656      * termination possible -- reducing worker count or removing tasks
    657      * from the queue during shutdown. The method is non-private to
    658      * allow access from ScheduledThreadPoolExecutor.
    659      */
    660     final void tryTerminate() {
    661         for (;;) {
    662             int c = ctl.get();
    663             if (isRunning(c) ||
    664                 runStateAtLeast(c, TIDYING) ||
    665                 (runStateOf(c) == SHUTDOWN && ! workQueue.isEmpty()))
    666                 return;
    667             if (workerCountOf(c) != 0) { // Eligible to terminate
    668                 interruptIdleWorkers(ONLY_ONE);
    669                 return;
    670             }
    671 
    672             final ReentrantLock mainLock = this.mainLock;
    673             mainLock.lock();
    674             try {
    675                 if (ctl.compareAndSet(c, ctlOf(TIDYING, 0))) {
    676                     try {
    677                         terminated();
    678                     } finally {
    679                         ctl.set(ctlOf(TERMINATED, 0));
    680                         termination.signalAll();
    681                     }
    682                     return;
    683                 }
    684             } finally {
    685                 mainLock.unlock();
    686             }
    687             // else retry on failed CAS
    688         }
    689     }
    690 
    691     /*
    692      * Methods for controlling interrupts to worker threads.
    693      */
    694 
    695     /**
    696      * If there is a security manager, makes sure caller has
    697      * permission to shut down threads in general (see shutdownPerm).
    698      * If this passes, additionally makes sure the caller is allowed
    699      * to interrupt each worker thread. This might not be true even if
    700      * first check passed, if the SecurityManager treats some threads
    701      * specially.
    702      */
    703     private void checkShutdownAccess() {
    704         SecurityManager security = System.getSecurityManager();
    705         if (security != null) {
    706             security.checkPermission(shutdownPerm);
    707             final ReentrantLock mainLock = this.mainLock;
    708             mainLock.lock();
    709             try {
    710                 for (Worker w : workers)
    711                     security.checkAccess(w.thread);
    712             } finally {
    713                 mainLock.unlock();
    714             }
    715         }
    716     }
    717 
    718     /**
    719      * Interrupts all threads, even if active. Ignores SecurityExceptions
    720      * (in which case some threads may remain uninterrupted).
    721      */
    722     private void interruptWorkers() {
    723         final ReentrantLock mainLock = this.mainLock;
    724         mainLock.lock();
    725         try {
    726             for (Worker w : workers)
    727                 w.interruptIfStarted();
    728         } finally {
    729             mainLock.unlock();
    730         }
    731     }
    732 
    733     /**
    734      * Interrupts threads that might be waiting for tasks (as
    735      * indicated by not being locked) so they can check for
    736      * termination or configuration changes. Ignores
    737      * SecurityExceptions (in which case some threads may remain
    738      * uninterrupted).
    739      *
    740      * @param onlyOne If true, interrupt at most one worker. This is
    741      * called only from tryTerminate when termination is otherwise
    742      * enabled but there are still other workers.  In this case, at
    743      * most one waiting worker is interrupted to propagate shutdown
    744      * signals in case all threads are currently waiting.
    745      * Interrupting any arbitrary thread ensures that newly arriving
    746      * workers since shutdown began will also eventually exit.
    747      * To guarantee eventual termination, it suffices to always
    748      * interrupt only one idle worker, but shutdown() interrupts all
    749      * idle workers so that redundant workers exit promptly, not
    750      * waiting for a straggler task to finish.
    751      */
    752     private void interruptIdleWorkers(boolean onlyOne) {
    753         final ReentrantLock mainLock = this.mainLock;
    754         mainLock.lock();
    755         try {
    756             for (Worker w : workers) {
    757                 Thread t = w.thread;
    758                 if (!t.isInterrupted() && w.tryLock()) {
    759                     try {
    760                         t.interrupt();
    761                     } catch (SecurityException ignore) {
    762                     } finally {
    763                         w.unlock();
    764                     }
    765                 }
    766                 if (onlyOne)
    767                     break;
    768             }
    769         } finally {
    770             mainLock.unlock();
    771         }
    772     }
    773 
    774     /**
    775      * Common form of interruptIdleWorkers, to avoid having to
    776      * remember what the boolean argument means.
    777      */
    778     private void interruptIdleWorkers() {
    779         interruptIdleWorkers(false);
    780     }
    781 
    782     private static final boolean ONLY_ONE = true;
    783 
    784     /*
    785      * Misc utilities, most of which are also exported to
    786      * ScheduledThreadPoolExecutor
    787      */
    788 
    789     /**
    790      * Invokes the rejected execution handler for the given command.
    791      * Package-protected for use by ScheduledThreadPoolExecutor.
    792      */
    793     final void reject(Runnable command) {
    794         handler.rejectedExecution(command, this);
    795     }
    796 
    797     /**
    798      * Performs any further cleanup following run state transition on
    799      * invocation of shutdown.  A no-op here, but used by
    800      * ScheduledThreadPoolExecutor to cancel delayed tasks.
    801      */
    802     void onShutdown() {
    803     }
    804 
    805     /**
    806      * State check needed by ScheduledThreadPoolExecutor to
    807      * enable running tasks during shutdown.
    808      *
    809      * @param shutdownOK true if should return true if SHUTDOWN
    810      */
    811     final boolean isRunningOrShutdown(boolean shutdownOK) {
    812         int rs = runStateOf(ctl.get());
    813         return rs == RUNNING || (rs == SHUTDOWN && shutdownOK);
    814     }
    815 
    816     /**
    817      * Drains the task queue into a new list, normally using
    818      * drainTo. But if the queue is a DelayQueue or any other kind of
    819      * queue for which poll or drainTo may fail to remove some
    820      * elements, it deletes them one by one.
    821      */
    822     private List<Runnable> drainQueue() {
    823         BlockingQueue<Runnable> q = workQueue;
    824         ArrayList<Runnable> taskList = new ArrayList<Runnable>();
    825         q.drainTo(taskList);
    826         if (!q.isEmpty()) {
    827             for (Runnable r : q.toArray(new Runnable[0])) {
    828                 if (q.remove(r))
    829                     taskList.add(r);
    830             }
    831         }
    832         return taskList;
    833     }
    834 
    835     /*
    836      * Methods for creating, running and cleaning up after workers
    837      */
    838 
    839     /**
    840      * Checks if a new worker can be added with respect to current
    841      * pool state and the given bound (either core or maximum). If so,
    842      * the worker count is adjusted accordingly, and, if possible, a
    843      * new worker is created and started, running firstTask as its
    844      * first task. This method returns false if the pool is stopped or
    845      * eligible to shut down. It also returns false if the thread
    846      * factory fails to create a thread when asked.  If the thread
    847      * creation fails, either due to the thread factory returning
    848      * null, or due to an exception (typically OutOfMemoryError in
    849      * Thread.start()), we roll back cleanly.
    850      *
    851      * @param firstTask the task the new thread should run first (or
    852      * null if none). Workers are created with an initial first task
    853      * (in method execute()) to bypass queuing when there are fewer
    854      * than corePoolSize threads (in which case we always start one),
    855      * or when the queue is full (in which case we must bypass queue).
    856      * Initially idle threads are usually created via
    857      * prestartCoreThread or to replace other dying workers.
    858      *
    859      * @param core if true use corePoolSize as bound, else
    860      * maximumPoolSize. (A boolean indicator is used here rather than a
    861      * value to ensure reads of fresh values after checking other pool
    862      * state).
    863      * @return true if successful
    864      */
    865     private boolean addWorker(Runnable firstTask, boolean core) {
    866         retry:
    867         for (;;) {
    868             int c = ctl.get();
    869             int rs = runStateOf(c);
    870 
    871             // Check if queue empty only if necessary.
    872             if (rs >= SHUTDOWN &&
    873                 ! (rs == SHUTDOWN &&
    874                    firstTask == null &&
    875                    ! workQueue.isEmpty()))
    876                 return false;
    877 
    878             for (;;) {
    879                 int wc = workerCountOf(c);
    880                 if (wc >= CAPACITY ||
    881                     wc >= (core ? corePoolSize : maximumPoolSize))
    882                     return false;
    883                 if (compareAndIncrementWorkerCount(c))
    884                     break retry;
    885                 c = ctl.get();  // Re-read ctl
    886                 if (runStateOf(c) != rs)
    887                     continue retry;
    888                 // else CAS failed due to workerCount change; retry inner loop
    889             }
    890         }
    891 
    892         boolean workerStarted = false;
    893         boolean workerAdded = false;
    894         Worker w = null;
    895         try {
    896             w = new Worker(firstTask);
    897             final Thread t = w.thread;
    898             if (t != null) {
    899                 final ReentrantLock mainLock = this.mainLock;
    900                 mainLock.lock();
    901                 try {
    902                     // Recheck while holding lock.
    903                     // Back out on ThreadFactory failure or if
    904                     // shut down before lock acquired.
    905                     int rs = runStateOf(ctl.get());
    906 
    907                     if (rs < SHUTDOWN ||
    908                         (rs == SHUTDOWN && firstTask == null)) {
    909                         if (t.isAlive()) // precheck that t is startable
    910                             throw new IllegalThreadStateException();
    911                         workers.add(w);
    912                         int s = workers.size();
    913                         if (s > largestPoolSize)
    914                             largestPoolSize = s;
    915                         workerAdded = true;
    916                     }
    917                 } finally {
    918                     mainLock.unlock();
    919                 }
    920                 if (workerAdded) {
    921                     t.start();
    922                     workerStarted = true;
    923                 }
    924             }
    925         } finally {
    926             if (! workerStarted)
    927                 addWorkerFailed(w);
    928         }
    929         return workerStarted;
    930     }
    931 
    932     /**
    933      * Rolls back the worker thread creation.
    934      * - removes worker from workers, if present
    935      * - decrements worker count
    936      * - rechecks for termination, in case the existence of this
    937      *   worker was holding up termination
    938      */
    939     private void addWorkerFailed(Worker w) {
    940         final ReentrantLock mainLock = this.mainLock;
    941         mainLock.lock();
    942         try {
    943             if (w != null)
    944                 workers.remove(w);
    945             decrementWorkerCount();
    946             tryTerminate();
    947         } finally {
    948             mainLock.unlock();
    949         }
    950     }
    951 
    952     /**
    953      * Performs cleanup and bookkeeping for a dying worker. Called
    954      * only from worker threads. Unless completedAbruptly is set,
    955      * assumes that workerCount has already been adjusted to account
    956      * for exit.  This method removes thread from worker set, and
    957      * possibly terminates the pool or replaces the worker if either
    958      * it exited due to user task exception or if fewer than
    959      * corePoolSize workers are running or queue is non-empty but
    960      * there are no workers.
    961      *
    962      * @param w the worker
    963      * @param completedAbruptly if the worker died due to user exception
    964      */
    965     private void processWorkerExit(Worker w, boolean completedAbruptly) {
    966         if (completedAbruptly) // If abrupt, then workerCount wasn't adjusted
    967             decrementWorkerCount();
    968 
    969         final ReentrantLock mainLock = this.mainLock;
    970         mainLock.lock();
    971         try {
    972             completedTaskCount += w.completedTasks;
    973             workers.remove(w);
    974         } finally {
    975             mainLock.unlock();
    976         }
    977 
    978         tryTerminate();
    979 
    980         int c = ctl.get();
    981         if (runStateLessThan(c, STOP)) {
    982             if (!completedAbruptly) {
    983                 int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
    984                 if (min == 0 && ! workQueue.isEmpty())
    985                     min = 1;
    986                 if (workerCountOf(c) >= min)
    987                     return; // replacement not needed
    988             }
    989             addWorker(null, false);
    990         }
    991     }
    992 
    993     /**
    994      * Performs blocking or timed wait for a task, depending on
    995      * current configuration settings, or returns null if this worker
    996      * must exit because of any of:
    997      * 1. There are more than maximumPoolSize workers (due to
    998      *    a call to setMaximumPoolSize).
    999      * 2. The pool is stopped.
   1000      * 3. The pool is shutdown and the queue is empty.
   1001      * 4. This worker timed out waiting for a task, and timed-out
   1002      *    workers are subject to termination (that is,
   1003      *    {@code allowCoreThreadTimeOut || workerCount > corePoolSize})
   1004      *    both before and after the timed wait, and if the queue is
   1005      *    non-empty, this worker is not the last thread in the pool.
   1006      *
   1007      * @return task, or null if the worker must exit, in which case
   1008      *         workerCount is decremented
   1009      */
   1010     private Runnable getTask() {
   1011         boolean timedOut = false; // Did the last poll() time out?
   1012 
   1013         for (;;) {
   1014             int c = ctl.get();
   1015             int rs = runStateOf(c);
   1016 
   1017             // Check if queue empty only if necessary.
   1018             if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
   1019                 decrementWorkerCount();
   1020                 return null;
   1021             }
   1022 
   1023             int wc = workerCountOf(c);
   1024 
   1025             // Are workers subject to culling?
   1026             boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
   1027 
   1028             if ((wc > maximumPoolSize || (timed && timedOut))
   1029                 && (wc > 1 || workQueue.isEmpty())) {
   1030                 if (compareAndDecrementWorkerCount(c))
   1031                     return null;
   1032                 continue;
   1033             }
   1034 
   1035             try {
   1036                 Runnable r = timed ?
   1037                     workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
   1038                     workQueue.take();
   1039                 if (r != null)
   1040                     return r;
   1041                 timedOut = true;
   1042             } catch (InterruptedException retry) {
   1043                 timedOut = false;
   1044             }
   1045         }
   1046     }
   1047 
   1048     /**
   1049      * Main worker run loop.  Repeatedly gets tasks from queue and
   1050      * executes them, while coping with a number of issues:
   1051      *
   1052      * 1. We may start out with an initial task, in which case we
   1053      * don't need to get the first one. Otherwise, as long as pool is
   1054      * running, we get tasks from getTask. If it returns null then the
   1055      * worker exits due to changed pool state or configuration
   1056      * parameters.  Other exits result from exception throws in
   1057      * external code, in which case completedAbruptly holds, which
   1058      * usually leads processWorkerExit to replace this thread.
   1059      *
   1060      * 2. Before running any task, the lock is acquired to prevent
   1061      * other pool interrupts while the task is executing, and then we
   1062      * ensure that unless pool is stopping, this thread does not have
   1063      * its interrupt set.
   1064      *
   1065      * 3. Each task run is preceded by a call to beforeExecute, which
   1066      * might throw an exception, in which case we cause thread to die
   1067      * (breaking loop with completedAbruptly true) without processing
   1068      * the task.
   1069      *
   1070      * 4. Assuming beforeExecute completes normally, we run the task,
   1071      * gathering any of its thrown exceptions to send to afterExecute.
   1072      * We separately handle RuntimeException, Error (both of which the
   1073      * specs guarantee that we trap) and arbitrary Throwables.
   1074      * Because we cannot rethrow Throwables within Runnable.run, we
   1075      * wrap them within Errors on the way out (to the thread's
   1076      * UncaughtExceptionHandler).  Any thrown exception also
   1077      * conservatively causes thread to die.
   1078      *
   1079      * 5. After task.run completes, we call afterExecute, which may
   1080      * also throw an exception, which will also cause thread to
   1081      * die. According to JLS Sec 14.20, this exception is the one that
   1082      * will be in effect even if task.run throws.
   1083      *
   1084      * The net effect of the exception mechanics is that afterExecute
   1085      * and the thread's UncaughtExceptionHandler have as accurate
   1086      * information as we can provide about any problems encountered by
   1087      * user code.
   1088      *
   1089      * @param w the worker
   1090      */
   1091     final void runWorker(Worker w) {
   1092         Thread wt = Thread.currentThread();
   1093         Runnable task = w.firstTask;
   1094         w.firstTask = null;
   1095         w.unlock(); // allow interrupts
   1096         boolean completedAbruptly = true;
   1097         try {
   1098             while (task != null || (task = getTask()) != null) {
   1099                 w.lock();
   1100                 // If pool is stopping, ensure thread is interrupted;
   1101                 // if not, ensure thread is not interrupted.  This
   1102                 // requires a recheck in second case to deal with
   1103                 // shutdownNow race while clearing interrupt
   1104                 if ((runStateAtLeast(ctl.get(), STOP) ||
   1105                      (Thread.interrupted() &&
   1106                       runStateAtLeast(ctl.get(), STOP))) &&
   1107                     !wt.isInterrupted())
   1108                     wt.interrupt();
   1109                 try {
   1110                     beforeExecute(wt, task);
   1111                     Throwable thrown = null;
   1112                     try {
   1113                         task.run();
   1114                     } catch (RuntimeException x) {
   1115                         thrown = x; throw x;
   1116                     } catch (Error x) {
   1117                         thrown = x; throw x;
   1118                     } catch (Throwable x) {
   1119                         thrown = x; throw new Error(x);
   1120                     } finally {
   1121                         afterExecute(task, thrown);
   1122                     }
   1123                 } finally {
   1124                     task = null;
   1125                     w.completedTasks++;
   1126                     w.unlock();
   1127                 }
   1128             }
   1129             completedAbruptly = false;
   1130         } finally {
   1131             processWorkerExit(w, completedAbruptly);
   1132         }
   1133     }
   1134 
   1135     // Public constructors and methods
   1136 
   1137     /**
   1138      * Creates a new {@code ThreadPoolExecutor} with the given initial
   1139      * parameters and default thread factory and rejected execution handler.
   1140      * It may be more convenient to use one of the {@link Executors} factory
   1141      * methods instead of this general purpose constructor.
   1142      *
   1143      * @param corePoolSize the number of threads to keep in the pool, even
   1144      *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
   1145      * @param maximumPoolSize the maximum number of threads to allow in the
   1146      *        pool
   1147      * @param keepAliveTime when the number of threads is greater than
   1148      *        the core, this is the maximum time that excess idle threads
   1149      *        will wait for new tasks before terminating.
   1150      * @param unit the time unit for the {@code keepAliveTime} argument
   1151      * @param workQueue the queue to use for holding tasks before they are
   1152      *        executed.  This queue will hold only the {@code Runnable}
   1153      *        tasks submitted by the {@code execute} method.
   1154      * @throws IllegalArgumentException if one of the following holds:<br>
   1155      *         {@code corePoolSize < 0}<br>
   1156      *         {@code keepAliveTime < 0}<br>
   1157      *         {@code maximumPoolSize <= 0}<br>
   1158      *         {@code maximumPoolSize < corePoolSize}
   1159      * @throws NullPointerException if {@code workQueue} is null
   1160      */
   1161     public ThreadPoolExecutor(int corePoolSize,
   1162                               int maximumPoolSize,
   1163                               long keepAliveTime,
   1164                               TimeUnit unit,
   1165                               BlockingQueue<Runnable> workQueue) {
   1166         this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
   1167              Executors.defaultThreadFactory(), defaultHandler);
   1168     }
   1169 
   1170     /**
   1171      * Creates a new {@code ThreadPoolExecutor} with the given initial
   1172      * parameters and default rejected execution handler.
   1173      *
   1174      * @param corePoolSize the number of threads to keep in the pool, even
   1175      *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
   1176      * @param maximumPoolSize the maximum number of threads to allow in the
   1177      *        pool
   1178      * @param keepAliveTime when the number of threads is greater than
   1179      *        the core, this is the maximum time that excess idle threads
   1180      *        will wait for new tasks before terminating.
   1181      * @param unit the time unit for the {@code keepAliveTime} argument
   1182      * @param workQueue the queue to use for holding tasks before they are
   1183      *        executed.  This queue will hold only the {@code Runnable}
   1184      *        tasks submitted by the {@code execute} method.
   1185      * @param threadFactory the factory to use when the executor
   1186      *        creates a new thread
   1187      * @throws IllegalArgumentException if one of the following holds:<br>
   1188      *         {@code corePoolSize < 0}<br>
   1189      *         {@code keepAliveTime < 0}<br>
   1190      *         {@code maximumPoolSize <= 0}<br>
   1191      *         {@code maximumPoolSize < corePoolSize}
   1192      * @throws NullPointerException if {@code workQueue}
   1193      *         or {@code threadFactory} is null
   1194      */
   1195     public ThreadPoolExecutor(int corePoolSize,
   1196                               int maximumPoolSize,
   1197                               long keepAliveTime,
   1198                               TimeUnit unit,
   1199                               BlockingQueue<Runnable> workQueue,
   1200                               ThreadFactory threadFactory) {
   1201         this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
   1202              threadFactory, defaultHandler);
   1203     }
   1204 
   1205     /**
   1206      * Creates a new {@code ThreadPoolExecutor} with the given initial
   1207      * parameters and default thread factory.
   1208      *
   1209      * @param corePoolSize the number of threads to keep in the pool, even
   1210      *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
   1211      * @param maximumPoolSize the maximum number of threads to allow in the
   1212      *        pool
   1213      * @param keepAliveTime when the number of threads is greater than
   1214      *        the core, this is the maximum time that excess idle threads
   1215      *        will wait for new tasks before terminating.
   1216      * @param unit the time unit for the {@code keepAliveTime} argument
   1217      * @param workQueue the queue to use for holding tasks before they are
   1218      *        executed.  This queue will hold only the {@code Runnable}
   1219      *        tasks submitted by the {@code execute} method.
   1220      * @param handler the handler to use when execution is blocked
   1221      *        because the thread bounds and queue capacities are reached
   1222      * @throws IllegalArgumentException if one of the following holds:<br>
   1223      *         {@code corePoolSize < 0}<br>
   1224      *         {@code keepAliveTime < 0}<br>
   1225      *         {@code maximumPoolSize <= 0}<br>
   1226      *         {@code maximumPoolSize < corePoolSize}
   1227      * @throws NullPointerException if {@code workQueue}
   1228      *         or {@code handler} is null
   1229      */
   1230     public ThreadPoolExecutor(int corePoolSize,
   1231                               int maximumPoolSize,
   1232                               long keepAliveTime,
   1233                               TimeUnit unit,
   1234                               BlockingQueue<Runnable> workQueue,
   1235                               RejectedExecutionHandler handler) {
   1236         this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
   1237              Executors.defaultThreadFactory(), handler);
   1238     }
   1239 
   1240     /**
   1241      * Creates a new {@code ThreadPoolExecutor} with the given initial
   1242      * parameters.
   1243      *
   1244      * @param corePoolSize the number of threads to keep in the pool, even
   1245      *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
   1246      * @param maximumPoolSize the maximum number of threads to allow in the
   1247      *        pool
   1248      * @param keepAliveTime when the number of threads is greater than
   1249      *        the core, this is the maximum time that excess idle threads
   1250      *        will wait for new tasks before terminating.
   1251      * @param unit the time unit for the {@code keepAliveTime} argument
   1252      * @param workQueue the queue to use for holding tasks before they are
   1253      *        executed.  This queue will hold only the {@code Runnable}
   1254      *        tasks submitted by the {@code execute} method.
   1255      * @param threadFactory the factory to use when the executor
   1256      *        creates a new thread
   1257      * @param handler the handler to use when execution is blocked
   1258      *        because the thread bounds and queue capacities are reached
   1259      * @throws IllegalArgumentException if one of the following holds:<br>
   1260      *         {@code corePoolSize < 0}<br>
   1261      *         {@code keepAliveTime < 0}<br>
   1262      *         {@code maximumPoolSize <= 0}<br>
   1263      *         {@code maximumPoolSize < corePoolSize}
   1264      * @throws NullPointerException if {@code workQueue}
   1265      *         or {@code threadFactory} or {@code handler} is null
   1266      */
   1267     public ThreadPoolExecutor(int corePoolSize,
   1268                               int maximumPoolSize,
   1269                               long keepAliveTime,
   1270                               TimeUnit unit,
   1271                               BlockingQueue<Runnable> workQueue,
   1272                               ThreadFactory threadFactory,
   1273                               RejectedExecutionHandler handler) {
   1274         if (corePoolSize < 0 ||
   1275             maximumPoolSize <= 0 ||
   1276             maximumPoolSize < corePoolSize ||
   1277             keepAliveTime < 0)
   1278             throw new IllegalArgumentException();
   1279         if (workQueue == null || threadFactory == null || handler == null)
   1280             throw new NullPointerException();
   1281         this.corePoolSize = corePoolSize;
   1282         this.maximumPoolSize = maximumPoolSize;
   1283         this.workQueue = workQueue;
   1284         this.keepAliveTime = unit.toNanos(keepAliveTime);
   1285         this.threadFactory = threadFactory;
   1286         this.handler = handler;
   1287     }
   1288 
   1289     /**
   1290      * Executes the given task sometime in the future.  The task
   1291      * may execute in a new thread or in an existing pooled thread.
   1292      *
   1293      * If the task cannot be submitted for execution, either because this
   1294      * executor has been shutdown or because its capacity has been reached,
   1295      * the task is handled by the current {@code RejectedExecutionHandler}.
   1296      *
   1297      * @param command the task to execute
   1298      * @throws RejectedExecutionException at discretion of
   1299      *         {@code RejectedExecutionHandler}, if the task
   1300      *         cannot be accepted for execution
   1301      * @throws NullPointerException if {@code command} is null
   1302      */
   1303     public void execute(Runnable command) {
   1304         if (command == null)
   1305             throw new NullPointerException();
   1306         /*
   1307          * Proceed in 3 steps:
   1308          *
   1309          * 1. If fewer than corePoolSize threads are running, try to
   1310          * start a new thread with the given command as its first
   1311          * task.  The call to addWorker atomically checks runState and
   1312          * workerCount, and so prevents false alarms that would add
   1313          * threads when it shouldn't, by returning false.
   1314          *
   1315          * 2. If a task can be successfully queued, then we still need
   1316          * to double-check whether we should have added a thread
   1317          * (because existing ones died since last checking) or that
   1318          * the pool shut down since entry into this method. So we
   1319          * recheck state and if necessary roll back the enqueuing if
   1320          * stopped, or start a new thread if there are none.
   1321          *
   1322          * 3. If we cannot queue task, then we try to add a new
   1323          * thread.  If it fails, we know we are shut down or saturated
   1324          * and so reject the task.
   1325          */
   1326         int c = ctl.get();
   1327         if (workerCountOf(c) < corePoolSize) {
   1328             if (addWorker(command, true))
   1329                 return;
   1330             c = ctl.get();
   1331         }
   1332         if (isRunning(c) && workQueue.offer(command)) {
   1333             int recheck = ctl.get();
   1334             if (! isRunning(recheck) && remove(command))
   1335                 reject(command);
   1336             else if (workerCountOf(recheck) == 0)
   1337                 addWorker(null, false);
   1338         }
   1339         else if (!addWorker(command, false))
   1340             reject(command);
   1341     }
   1342 
   1343     /**
   1344      * Initiates an orderly shutdown in which previously submitted
   1345      * tasks are executed, but no new tasks will be accepted.
   1346      * Invocation has no additional effect if already shut down.
   1347      *
   1348      * <p>This method does not wait for previously submitted tasks to
   1349      * complete execution.  Use {@link #awaitTermination awaitTermination}
   1350      * to do that.
   1351      */
   1352     // android-note: Removed @throws SecurityException
   1353     public void shutdown() {
   1354         final ReentrantLock mainLock = this.mainLock;
   1355         mainLock.lock();
   1356         try {
   1357             checkShutdownAccess();
   1358             advanceRunState(SHUTDOWN);
   1359             interruptIdleWorkers();
   1360             onShutdown(); // hook for ScheduledThreadPoolExecutor
   1361         } finally {
   1362             mainLock.unlock();
   1363         }
   1364         tryTerminate();
   1365     }
   1366 
   1367     /**
   1368      * Attempts to stop all actively executing tasks, halts the
   1369      * processing of waiting tasks, and returns a list of the tasks
   1370      * that were awaiting execution. These tasks are drained (removed)
   1371      * from the task queue upon return from this method.
   1372      *
   1373      * <p>This method does not wait for actively executing tasks to
   1374      * terminate.  Use {@link #awaitTermination awaitTermination} to
   1375      * do that.
   1376      *
   1377      * <p>There are no guarantees beyond best-effort attempts to stop
   1378      * processing actively executing tasks.  This implementation
   1379      * cancels tasks via {@link Thread#interrupt}, so any task that
   1380      * fails to respond to interrupts may never terminate.
   1381      */
   1382     // android-note: Removed @throws SecurityException
   1383     public List<Runnable> shutdownNow() {
   1384         List<Runnable> tasks;
   1385         final ReentrantLock mainLock = this.mainLock;
   1386         mainLock.lock();
   1387         try {
   1388             checkShutdownAccess();
   1389             advanceRunState(STOP);
   1390             interruptWorkers();
   1391             tasks = drainQueue();
   1392         } finally {
   1393             mainLock.unlock();
   1394         }
   1395         tryTerminate();
   1396         return tasks;
   1397     }
   1398 
   1399     public boolean isShutdown() {
   1400         return ! isRunning(ctl.get());
   1401     }
   1402 
   1403     /**
   1404      * Returns true if this executor is in the process of terminating
   1405      * after {@link #shutdown} or {@link #shutdownNow} but has not
   1406      * completely terminated.  This method may be useful for
   1407      * debugging. A return of {@code true} reported a sufficient
   1408      * period after shutdown may indicate that submitted tasks have
   1409      * ignored or suppressed interruption, causing this executor not
   1410      * to properly terminate.
   1411      *
   1412      * @return {@code true} if terminating but not yet terminated
   1413      */
   1414     public boolean isTerminating() {
   1415         int c = ctl.get();
   1416         return ! isRunning(c) && runStateLessThan(c, TERMINATED);
   1417     }
   1418 
   1419     public boolean isTerminated() {
   1420         return runStateAtLeast(ctl.get(), TERMINATED);
   1421     }
   1422 
   1423     public boolean awaitTermination(long timeout, TimeUnit unit)
   1424         throws InterruptedException {
   1425         long nanos = unit.toNanos(timeout);
   1426         final ReentrantLock mainLock = this.mainLock;
   1427         mainLock.lock();
   1428         try {
   1429             for (;;) {
   1430                 if (runStateAtLeast(ctl.get(), TERMINATED))
   1431                     return true;
   1432                 if (nanos <= 0)
   1433                     return false;
   1434                 nanos = termination.awaitNanos(nanos);
   1435             }
   1436         } finally {
   1437             mainLock.unlock();
   1438         }
   1439     }
   1440 
   1441     /**
   1442      * Invokes {@code shutdown} when this executor is no longer
   1443      * referenced and it has no threads.
   1444      */
   1445     protected void finalize() {
   1446         shutdown();
   1447     }
   1448 
   1449     /**
   1450      * Sets the thread factory used to create new threads.
   1451      *
   1452      * @param threadFactory the new thread factory
   1453      * @throws NullPointerException if threadFactory is null
   1454      * @see #getThreadFactory
   1455      */
   1456     public void setThreadFactory(ThreadFactory threadFactory) {
   1457         if (threadFactory == null)
   1458             throw new NullPointerException();
   1459         this.threadFactory = threadFactory;
   1460     }
   1461 
   1462     /**
   1463      * Returns the thread factory used to create new threads.
   1464      *
   1465      * @return the current thread factory
   1466      * @see #setThreadFactory(ThreadFactory)
   1467      */
   1468     public ThreadFactory getThreadFactory() {
   1469         return threadFactory;
   1470     }
   1471 
   1472     /**
   1473      * Sets a new handler for unexecutable tasks.
   1474      *
   1475      * @param handler the new handler
   1476      * @throws NullPointerException if handler is null
   1477      * @see #getRejectedExecutionHandler
   1478      */
   1479     public void setRejectedExecutionHandler(RejectedExecutionHandler handler) {
   1480         if (handler == null)
   1481             throw new NullPointerException();
   1482         this.handler = handler;
   1483     }
   1484 
   1485     /**
   1486      * Returns the current handler for unexecutable tasks.
   1487      *
   1488      * @return the current handler
   1489      * @see #setRejectedExecutionHandler(RejectedExecutionHandler)
   1490      */
   1491     public RejectedExecutionHandler getRejectedExecutionHandler() {
   1492         return handler;
   1493     }
   1494 
   1495     /**
   1496      * Sets the core number of threads.  This overrides any value set
   1497      * in the constructor.  If the new value is smaller than the
   1498      * current value, excess existing threads will be terminated when
   1499      * they next become idle.  If larger, new threads will, if needed,
   1500      * be started to execute any queued tasks.
   1501      *
   1502      * @param corePoolSize the new core size
   1503      * @throws IllegalArgumentException if {@code corePoolSize < 0}
   1504      * @see #getCorePoolSize
   1505      */
   1506     public void setCorePoolSize(int corePoolSize) {
   1507         if (corePoolSize < 0)
   1508             throw new IllegalArgumentException();
   1509         int delta = corePoolSize - this.corePoolSize;
   1510         this.corePoolSize = corePoolSize;
   1511         if (workerCountOf(ctl.get()) > corePoolSize)
   1512             interruptIdleWorkers();
   1513         else if (delta > 0) {
   1514             // We don't really know how many new threads are "needed".
   1515             // As a heuristic, prestart enough new workers (up to new
   1516             // core size) to handle the current number of tasks in
   1517             // queue, but stop if queue becomes empty while doing so.
   1518             int k = Math.min(delta, workQueue.size());
   1519             while (k-- > 0 && addWorker(null, true)) {
   1520                 if (workQueue.isEmpty())
   1521                     break;
   1522             }
   1523         }
   1524     }
   1525 
   1526     /**
   1527      * Returns the core number of threads.
   1528      *
   1529      * @return the core number of threads
   1530      * @see #setCorePoolSize
   1531      */
   1532     public int getCorePoolSize() {
   1533         return corePoolSize;
   1534     }
   1535 
   1536     /**
   1537      * Starts a core thread, causing it to idly wait for work. This
   1538      * overrides the default policy of starting core threads only when
   1539      * new tasks are executed. This method will return {@code false}
   1540      * if all core threads have already been started.
   1541      *
   1542      * @return {@code true} if a thread was started
   1543      */
   1544     public boolean prestartCoreThread() {
   1545         return workerCountOf(ctl.get()) < corePoolSize &&
   1546             addWorker(null, true);
   1547     }
   1548 
   1549     /**
   1550      * Same as prestartCoreThread except arranges that at least one
   1551      * thread is started even if corePoolSize is 0.
   1552      */
   1553     void ensurePrestart() {
   1554         int wc = workerCountOf(ctl.get());
   1555         if (wc < corePoolSize)
   1556             addWorker(null, true);
   1557         else if (wc == 0)
   1558             addWorker(null, false);
   1559     }
   1560 
   1561     /**
   1562      * Starts all core threads, causing them to idly wait for work. This
   1563      * overrides the default policy of starting core threads only when
   1564      * new tasks are executed.
   1565      *
   1566      * @return the number of threads started
   1567      */
   1568     public int prestartAllCoreThreads() {
   1569         int n = 0;
   1570         while (addWorker(null, true))
   1571             ++n;
   1572         return n;
   1573     }
   1574 
   1575     /**
   1576      * Returns true if this pool allows core threads to time out and
   1577      * terminate if no tasks arrive within the keepAlive time, being
   1578      * replaced if needed when new tasks arrive. When true, the same
   1579      * keep-alive policy applying to non-core threads applies also to
   1580      * core threads. When false (the default), core threads are never
   1581      * terminated due to lack of incoming tasks.
   1582      *
   1583      * @return {@code true} if core threads are allowed to time out,
   1584      *         else {@code false}
   1585      *
   1586      * @since 1.6
   1587      */
   1588     public boolean allowsCoreThreadTimeOut() {
   1589         return allowCoreThreadTimeOut;
   1590     }
   1591 
   1592     /**
   1593      * Sets the policy governing whether core threads may time out and
   1594      * terminate if no tasks arrive within the keep-alive time, being
   1595      * replaced if needed when new tasks arrive. When false, core
   1596      * threads are never terminated due to lack of incoming
   1597      * tasks. When true, the same keep-alive policy applying to
   1598      * non-core threads applies also to core threads. To avoid
   1599      * continual thread replacement, the keep-alive time must be
   1600      * greater than zero when setting {@code true}. This method
   1601      * should in general be called before the pool is actively used.
   1602      *
   1603      * @param value {@code true} if should time out, else {@code false}
   1604      * @throws IllegalArgumentException if value is {@code true}
   1605      *         and the current keep-alive time is not greater than zero
   1606      *
   1607      * @since 1.6
   1608      */
   1609     public void allowCoreThreadTimeOut(boolean value) {
   1610         if (value && keepAliveTime <= 0)
   1611             throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
   1612         if (value != allowCoreThreadTimeOut) {
   1613             allowCoreThreadTimeOut = value;
   1614             if (value)
   1615                 interruptIdleWorkers();
   1616         }
   1617     }
   1618 
   1619     /**
   1620      * Sets the maximum allowed number of threads. This overrides any
   1621      * value set in the constructor. If the new value is smaller than
   1622      * the current value, excess existing threads will be
   1623      * terminated when they next become idle.
   1624      *
   1625      * @param maximumPoolSize the new maximum
   1626      * @throws IllegalArgumentException if the new maximum is
   1627      *         less than or equal to zero, or
   1628      *         less than the {@linkplain #getCorePoolSize core pool size}
   1629      * @see #getMaximumPoolSize
   1630      */
   1631     public void setMaximumPoolSize(int maximumPoolSize) {
   1632         if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
   1633             throw new IllegalArgumentException();
   1634         this.maximumPoolSize = maximumPoolSize;
   1635         if (workerCountOf(ctl.get()) > maximumPoolSize)
   1636             interruptIdleWorkers();
   1637     }
   1638 
   1639     /**
   1640      * Returns the maximum allowed number of threads.
   1641      *
   1642      * @return the maximum allowed number of threads
   1643      * @see #setMaximumPoolSize
   1644      */
   1645     public int getMaximumPoolSize() {
   1646         return maximumPoolSize;
   1647     }
   1648 
   1649     /**
   1650      * Sets the time limit for which threads may remain idle before
   1651      * being terminated.  If there are more than the core number of
   1652      * threads currently in the pool, after waiting this amount of
   1653      * time without processing a task, excess threads will be
   1654      * terminated.  This overrides any value set in the constructor.
   1655      *
   1656      * @param time the time to wait.  A time value of zero will cause
   1657      *        excess threads to terminate immediately after executing tasks.
   1658      * @param unit the time unit of the {@code time} argument
   1659      * @throws IllegalArgumentException if {@code time} less than zero or
   1660      *         if {@code time} is zero and {@code allowsCoreThreadTimeOut}
   1661      * @see #getKeepAliveTime(TimeUnit)
   1662      */
   1663     public void setKeepAliveTime(long time, TimeUnit unit) {
   1664         if (time < 0)
   1665             throw new IllegalArgumentException();
   1666         if (time == 0 && allowsCoreThreadTimeOut())
   1667             throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
   1668         long keepAliveTime = unit.toNanos(time);
   1669         long delta = keepAliveTime - this.keepAliveTime;
   1670         this.keepAliveTime = keepAliveTime;
   1671         if (delta < 0)
   1672             interruptIdleWorkers();
   1673     }
   1674 
   1675     /**
   1676      * Returns the thread keep-alive time, which is the amount of time
   1677      * that threads in excess of the core pool size may remain
   1678      * idle before being terminated.
   1679      *
   1680      * @param unit the desired time unit of the result
   1681      * @return the time limit
   1682      * @see #setKeepAliveTime(long, TimeUnit)
   1683      */
   1684     public long getKeepAliveTime(TimeUnit unit) {
   1685         return unit.convert(keepAliveTime, TimeUnit.NANOSECONDS);
   1686     }
   1687 
   1688     /* User-level queue utilities */
   1689 
   1690     /**
   1691      * Returns the task queue used by this executor. Access to the
   1692      * task queue is intended primarily for debugging and monitoring.
   1693      * This queue may be in active use.  Retrieving the task queue
   1694      * does not prevent queued tasks from executing.
   1695      *
   1696      * @return the task queue
   1697      */
   1698     public BlockingQueue<Runnable> getQueue() {
   1699         return workQueue;
   1700     }
   1701 
   1702     /**
   1703      * Removes this task from the executor's internal queue if it is
   1704      * present, thus causing it not to be run if it has not already
   1705      * started.
   1706      *
   1707      * <p>This method may be useful as one part of a cancellation
   1708      * scheme.  It may fail to remove tasks that have been converted
   1709      * into other forms before being placed on the internal queue. For
   1710      * example, a task entered using {@code submit} might be
   1711      * converted into a form that maintains {@code Future} status.
   1712      * However, in such cases, method {@link #purge} may be used to
   1713      * remove those Futures that have been cancelled.
   1714      *
   1715      * @param task the task to remove
   1716      * @return {@code true} if the task was removed
   1717      */
   1718     public boolean remove(Runnable task) {
   1719         boolean removed = workQueue.remove(task);
   1720         tryTerminate(); // In case SHUTDOWN and now empty
   1721         return removed;
   1722     }
   1723 
   1724     /**
   1725      * Tries to remove from the work queue all {@link Future}
   1726      * tasks that have been cancelled. This method can be useful as a
   1727      * storage reclamation operation, that has no other impact on
   1728      * functionality. Cancelled tasks are never executed, but may
   1729      * accumulate in work queues until worker threads can actively
   1730      * remove them. Invoking this method instead tries to remove them now.
   1731      * However, this method may fail to remove tasks in
   1732      * the presence of interference by other threads.
   1733      */
   1734     public void purge() {
   1735         final BlockingQueue<Runnable> q = workQueue;
   1736         try {
   1737             Iterator<Runnable> it = q.iterator();
   1738             while (it.hasNext()) {
   1739                 Runnable r = it.next();
   1740                 if (r instanceof Future<?> && ((Future<?>)r).isCancelled())
   1741                     it.remove();
   1742             }
   1743         } catch (ConcurrentModificationException fallThrough) {
   1744             // Take slow path if we encounter interference during traversal.
   1745             // Make copy for traversal and call remove for cancelled entries.
   1746             // The slow path is more likely to be O(N*N).
   1747             for (Object r : q.toArray())
   1748                 if (r instanceof Future<?> && ((Future<?>)r).isCancelled())
   1749                     q.remove(r);
   1750         }
   1751 
   1752         tryTerminate(); // In case SHUTDOWN and now empty
   1753     }
   1754 
   1755     /* Statistics */
   1756 
   1757     /**
   1758      * Returns the current number of threads in the pool.
   1759      *
   1760      * @return the number of threads
   1761      */
   1762     public int getPoolSize() {
   1763         final ReentrantLock mainLock = this.mainLock;
   1764         mainLock.lock();
   1765         try {
   1766             // Remove rare and surprising possibility of
   1767             // isTerminated() && getPoolSize() > 0
   1768             return runStateAtLeast(ctl.get(), TIDYING) ? 0
   1769                 : workers.size();
   1770         } finally {
   1771             mainLock.unlock();
   1772         }
   1773     }
   1774 
   1775     /**
   1776      * Returns the approximate number of threads that are actively
   1777      * executing tasks.
   1778      *
   1779      * @return the number of threads
   1780      */
   1781     public int getActiveCount() {
   1782         final ReentrantLock mainLock = this.mainLock;
   1783         mainLock.lock();
   1784         try {
   1785             int n = 0;
   1786             for (Worker w : workers)
   1787                 if (w.isLocked())
   1788                     ++n;
   1789             return n;
   1790         } finally {
   1791             mainLock.unlock();
   1792         }
   1793     }
   1794 
   1795     /**
   1796      * Returns the largest number of threads that have ever
   1797      * simultaneously been in the pool.
   1798      *
   1799      * @return the number of threads
   1800      */
   1801     public int getLargestPoolSize() {
   1802         final ReentrantLock mainLock = this.mainLock;
   1803         mainLock.lock();
   1804         try {
   1805             return largestPoolSize;
   1806         } finally {
   1807             mainLock.unlock();
   1808         }
   1809     }
   1810 
   1811     /**
   1812      * Returns the approximate total number of tasks that have ever been
   1813      * scheduled for execution. Because the states of tasks and
   1814      * threads may change dynamically during computation, the returned
   1815      * value is only an approximation.
   1816      *
   1817      * @return the number of tasks
   1818      */
   1819     public long getTaskCount() {
   1820         final ReentrantLock mainLock = this.mainLock;
   1821         mainLock.lock();
   1822         try {
   1823             long n = completedTaskCount;
   1824             for (Worker w : workers) {
   1825                 n += w.completedTasks;
   1826                 if (w.isLocked())
   1827                     ++n;
   1828             }
   1829             return n + workQueue.size();
   1830         } finally {
   1831             mainLock.unlock();
   1832         }
   1833     }
   1834 
   1835     /**
   1836      * Returns the approximate total number of tasks that have
   1837      * completed execution. Because the states of tasks and threads
   1838      * may change dynamically during computation, the returned value
   1839      * is only an approximation, but one that does not ever decrease
   1840      * across successive calls.
   1841      *
   1842      * @return the number of tasks
   1843      */
   1844     public long getCompletedTaskCount() {
   1845         final ReentrantLock mainLock = this.mainLock;
   1846         mainLock.lock();
   1847         try {
   1848             long n = completedTaskCount;
   1849             for (Worker w : workers)
   1850                 n += w.completedTasks;
   1851             return n;
   1852         } finally {
   1853             mainLock.unlock();
   1854         }
   1855     }
   1856 
   1857     /**
   1858      * Returns a string identifying this pool, as well as its state,
   1859      * including indications of run state and estimated worker and
   1860      * task counts.
   1861      *
   1862      * @return a string identifying this pool, as well as its state
   1863      */
   1864     public String toString() {
   1865         long ncompleted;
   1866         int nworkers, nactive;
   1867         final ReentrantLock mainLock = this.mainLock;
   1868         mainLock.lock();
   1869         try {
   1870             ncompleted = completedTaskCount;
   1871             nactive = 0;
   1872             nworkers = workers.size();
   1873             for (Worker w : workers) {
   1874                 ncompleted += w.completedTasks;
   1875                 if (w.isLocked())
   1876                     ++nactive;
   1877             }
   1878         } finally {
   1879             mainLock.unlock();
   1880         }
   1881         int c = ctl.get();
   1882         String rs = (runStateLessThan(c, SHUTDOWN) ? "Running" :
   1883                      (runStateAtLeast(c, TERMINATED) ? "Terminated" :
   1884                       "Shutting down"));
   1885         return super.toString() +
   1886             "[" + rs +
   1887             ", pool size = " + nworkers +
   1888             ", active threads = " + nactive +
   1889             ", queued tasks = " + workQueue.size() +
   1890             ", completed tasks = " + ncompleted +
   1891             "]";
   1892     }
   1893 
   1894     /* Extension hooks */
   1895 
   1896     /**
   1897      * Method invoked prior to executing the given Runnable in the
   1898      * given thread.  This method is invoked by thread {@code t} that
   1899      * will execute task {@code r}, and may be used to re-initialize
   1900      * ThreadLocals, or to perform logging.
   1901      *
   1902      * <p>This implementation does nothing, but may be customized in
   1903      * subclasses. Note: To properly nest multiple overridings, subclasses
   1904      * should generally invoke {@code super.beforeExecute} at the end of
   1905      * this method.
   1906      *
   1907      * @param t the thread that will run task {@code r}
   1908      * @param r the task that will be executed
   1909      */
   1910     protected void beforeExecute(Thread t, Runnable r) { }
   1911 
   1912     /**
   1913      * Method invoked upon completion of execution of the given Runnable.
   1914      * This method is invoked by the thread that executed the task. If
   1915      * non-null, the Throwable is the uncaught {@code RuntimeException}
   1916      * or {@code Error} that caused execution to terminate abruptly.
   1917      *
   1918      * <p>This implementation does nothing, but may be customized in
   1919      * subclasses. Note: To properly nest multiple overridings, subclasses
   1920      * should generally invoke {@code super.afterExecute} at the
   1921      * beginning of this method.
   1922      *
   1923      * <p><b>Note:</b> When actions are enclosed in tasks (such as
   1924      * {@link FutureTask}) either explicitly or via methods such as
   1925      * {@code submit}, these task objects catch and maintain
   1926      * computational exceptions, and so they do not cause abrupt
   1927      * termination, and the internal exceptions are <em>not</em>
   1928      * passed to this method. If you would like to trap both kinds of
   1929      * failures in this method, you can further probe for such cases,
   1930      * as in this sample subclass that prints either the direct cause
   1931      * or the underlying exception if a task has been aborted:
   1932      *
   1933      *  <pre> {@code
   1934      * class ExtendedExecutor extends ThreadPoolExecutor {
   1935      *   // ...
   1936      *   protected void afterExecute(Runnable r, Throwable t) {
   1937      *     super.afterExecute(r, t);
   1938      *     if (t == null && r instanceof Future<?>) {
   1939      *       try {
   1940      *         Object result = ((Future<?>) r).get();
   1941      *       } catch (CancellationException ce) {
   1942      *           t = ce;
   1943      *       } catch (ExecutionException ee) {
   1944      *           t = ee.getCause();
   1945      *       } catch (InterruptedException ie) {
   1946      *           Thread.currentThread().interrupt(); // ignore/reset
   1947      *       }
   1948      *     }
   1949      *     if (t != null)
   1950      *       System.out.println(t);
   1951      *   }
   1952      * }}</pre>
   1953      *
   1954      * @param r the runnable that has completed
   1955      * @param t the exception that caused termination, or null if
   1956      * execution completed normally
   1957      */
   1958     protected void afterExecute(Runnable r, Throwable t) { }
   1959 
   1960     /**
   1961      * Method invoked when the Executor has terminated.  Default
   1962      * implementation does nothing. Note: To properly nest multiple
   1963      * overridings, subclasses should generally invoke
   1964      * {@code super.terminated} within this method.
   1965      */
   1966     protected void terminated() { }
   1967 
   1968     /* Predefined RejectedExecutionHandlers */
   1969 
   1970     /**
   1971      * A handler for rejected tasks that runs the rejected task
   1972      * directly in the calling thread of the {@code execute} method,
   1973      * unless the executor has been shut down, in which case the task
   1974      * is discarded.
   1975      */
   1976     public static class CallerRunsPolicy implements RejectedExecutionHandler {
   1977         /**
   1978          * Creates a {@code CallerRunsPolicy}.
   1979          */
   1980         public CallerRunsPolicy() { }
   1981 
   1982         /**
   1983          * Executes task r in the caller's thread, unless the executor
   1984          * has been shut down, in which case the task is discarded.
   1985          *
   1986          * @param r the runnable task requested to be executed
   1987          * @param e the executor attempting to execute this task
   1988          */
   1989         public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
   1990             if (!e.isShutdown()) {
   1991                 r.run();
   1992             }
   1993         }
   1994     }
   1995 
   1996     /**
   1997      * A handler for rejected tasks that throws a
   1998      * {@code RejectedExecutionException}.
   1999      */
   2000     public static class AbortPolicy implements RejectedExecutionHandler {
   2001         /**
   2002          * Creates an {@code AbortPolicy}.
   2003          */
   2004         public AbortPolicy() { }
   2005 
   2006         /**
   2007          * Always throws RejectedExecutionException.
   2008          *
   2009          * @param r the runnable task requested to be executed
   2010          * @param e the executor attempting to execute this task
   2011          * @throws RejectedExecutionException always
   2012          */
   2013         public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
   2014             throw new RejectedExecutionException("Task " + r.toString() +
   2015                                                  " rejected from " +
   2016                                                  e.toString());
   2017         }
   2018     }
   2019 
   2020     /**
   2021      * A handler for rejected tasks that silently discards the
   2022      * rejected task.
   2023      */
   2024     public static class DiscardPolicy implements RejectedExecutionHandler {
   2025         /**
   2026          * Creates a {@code DiscardPolicy}.
   2027          */
   2028         public DiscardPolicy() { }
   2029 
   2030         /**
   2031          * Does nothing, which has the effect of discarding task r.
   2032          *
   2033          * @param r the runnable task requested to be executed
   2034          * @param e the executor attempting to execute this task
   2035          */
   2036         public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
   2037         }
   2038     }
   2039 
   2040     /**
   2041      * A handler for rejected tasks that discards the oldest unhandled
   2042      * request and then retries {@code execute}, unless the executor
   2043      * is shut down, in which case the task is discarded.
   2044      */
   2045     public static class DiscardOldestPolicy implements RejectedExecutionHandler {
   2046         /**
   2047          * Creates a {@code DiscardOldestPolicy} for the given executor.
   2048          */
   2049         public DiscardOldestPolicy() { }
   2050 
   2051         /**
   2052          * Obtains and ignores the next task that the executor
   2053          * would otherwise execute, if one is immediately available,
   2054          * and then retries execution of task r, unless the executor
   2055          * is shut down, in which case task r is instead discarded.
   2056          *
   2057          * @param r the runnable task requested to be executed
   2058          * @param e the executor attempting to execute this task
   2059          */
   2060         public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
   2061             if (!e.isShutdown()) {
   2062                 e.getQueue().poll();
   2063                 e.execute(r);
   2064             }
   2065         }
   2066     }
   2067 }
   2068