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