ThreadPoolExecutor.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://creativecommons.org/licenses/publicdomain
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.concurrent;
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.concurrent.locks.*;
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.*;
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-note
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Altered {@link TimeUnit#NANOSECONDS} because our javadoc tool doesn't
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// like it.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An {@link ExecutorService} that executes each submitted task using
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one of possibly several pooled threads, normally configured
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using {@link Executors} factory methods.
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Thread pools address two different problems: they usually
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provide improved performance when executing large numbers of
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * asynchronous tasks, due to reduced per-task invocation overhead,
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and they provide a means of bounding and managing the resources,
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including threads, consumed when executing a collection of tasks.
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Each <tt>ThreadPoolExecutor</tt> also maintains some basic
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * statistics, such as the number of completed tasks.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>To be useful across a wide range of contexts, this class
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provides many adjustable parameters and extensibility
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hooks. However, programmers are urged to use the more convenient
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link Executors} factory methods {@link
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Executors#newCachedThreadPool} (unbounded thread pool, with
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * automatic thread reclamation), {@link Executors#newFixedThreadPool}
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (fixed size thread pool) and {@link
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Executors#newSingleThreadExecutor} (single background thread), that
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * preconfigure settings for the most common usage
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * scenarios. Otherwise, use the following guide when manually
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * configuring and tuning this class:
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dl>
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Core and maximum pool sizes</dt>
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>A <tt>ThreadPoolExecutor</tt> will automatically adjust the
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pool size
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (see {@link ThreadPoolExecutor#getPoolSize})
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * according to the bounds set by corePoolSize
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (see {@link ThreadPoolExecutor#getCorePoolSize})
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximumPoolSize
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (see {@link ThreadPoolExecutor#getMaximumPoolSize}).
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When a new task is submitted in method {@link
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#execute}, and fewer than corePoolSize threads
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are running, a new thread is created to handle the request, even if
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other worker threads are idle.  If there are more than
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * corePoolSize but less than maximumPoolSize threads running, a new
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread will be created only if the queue is full.  By setting
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * corePoolSize and maximumPoolSize the same, you create a fixed-size
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread pool. By setting maximumPoolSize to an essentially unbounded
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value such as <tt>Integer.MAX_VALUE</tt>, you allow the pool to
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * accommodate an arbitrary number of concurrent tasks. Most typically,
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * core and maximum pool sizes are set only upon construction, but they
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * may also be changed dynamically using {@link
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#setCorePoolSize} and {@link
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#setMaximumPoolSize}. <dd>
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt> On-demand construction
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd> By default, even core threads are initially created and
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * started only when needed by new tasks, but this can be overridden
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * dynamically using method {@link
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#prestartCoreThread} or
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link ThreadPoolExecutor#prestartAllCoreThreads}.  </dd>
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Creating new threads</dt>
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>New threads are created using a {@link
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.util.concurrent.ThreadFactory}.  If not otherwise specified, a
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link Executors#defaultThreadFactory} is used, that creates threads to all
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be in the same {@link ThreadGroup} and with the same
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tt>NORM_PRIORITY</tt> priority and non-daemon status. By supplying
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a different ThreadFactory, you can alter the thread's name, thread
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * group, priority, daemon status, etc.  </dd>
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Keep-alive times</dt>
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>If the pool currently has more than corePoolSize threads,
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * excess threads will be terminated if they have been idle for more
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * than the keepAliveTime (see {@link
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reducing resource consumption when the pool is not being actively
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used. If the pool becomes more active later, new threads will be
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructed. This parameter can also be changed dynamically
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value of <tt>Long.MAX_VALUE</tt> <code>TimeUnit.NANOSECONDS</code>
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * effectively disables idle threads from ever terminating prior
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to shut down.
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </dd>
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Queuing</dt>
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>Any {@link BlockingQueue} may be used to transfer and hold
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * submitted tasks.  The use of this queue interacts with pool sizing:
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If fewer than corePoolSize threads are running, the Executor
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * always prefers adding a new thread
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * rather than queuing.</li>
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If corePoolSize or more threads are running, the Executor
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * always prefers queuing a request rather than adding a new
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread.</li>
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If a request cannot be queued, a new thread is created unless
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this would exceed maximumPoolSize, in which case, the task will be
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * rejected.</li>
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * There are three general strategies for queuing:
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol>
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> <em> Direct handoffs.</em> A good default choice for a work
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue is a {@link SynchronousQueue} that hands off tasks to threads
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * without otherwise holding them. Here, an attempt to queue a task
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will fail if no threads are immediately available to run it, so a
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * new thread will be constructed. This policy avoids lockups when
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handling sets of requests that might have internal dependencies.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Direct handoffs generally require unbounded maximumPoolSizes to
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * avoid rejection of new submitted tasks. This in turn admits the
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * possibility of unbounded thread growth when commands continue to
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * arrive on average faster than they can be processed.  </li>
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><em> Unbounded queues.</em> Using an unbounded queue (for
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example a {@link LinkedBlockingQueue} without a predefined
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity) will cause new tasks to be queued in cases where all
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * corePoolSize threads are busy. Thus, no more than corePoolSize
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * threads will ever be created. (And the value of the maximumPoolSize
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * therefore doesn't have any effect.)  This may be appropriate when
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * each task is completely independent of others, so tasks cannot
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * affect each others execution; for example, in a web page server.
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * While this style of queuing can be useful in smoothing out
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * transient bursts of requests, it admits the possibility of
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unbounded work queue growth when commands continue to arrive on
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * average faster than they can be processed.  </li>
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><em>Bounded queues.</em> A bounded queue (for example, an
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link ArrayBlockingQueue}) helps prevent resource exhaustion when
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used with finite maximumPoolSizes, but can be more difficult to
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tune and control.  Queue sizes and maximum pool sizes may be traded
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * off for each other: Using large queues and small pools minimizes
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CPU usage, OS resources, and context-switching overhead, but can
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * lead to artificially low throughput.  If tasks frequently block (for
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example if they are I/O bound), a system may be able to schedule
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * time for more threads than you otherwise allow. Use of small queues
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * generally requires larger pool sizes, which keeps CPUs busier but
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * may encounter unacceptable scheduling overhead, which also
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * decreases throughput.  </li>
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol>
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </dd>
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Rejected tasks</dt>
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd> New tasks submitted in method {@link
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#execute} will be <em>rejected</em> when the
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Executor has been shut down, and also when the Executor uses finite
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bounds for both maximum threads and work queue capacity, and is
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * saturated.  In either case, the <tt>execute</tt> method invokes the
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link RejectedExecutionHandler#rejectedExecution} method of its
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link RejectedExecutionHandler}.  Four predefined handler policies
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are provided:
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol>
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> In the
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default {@link ThreadPoolExecutor.AbortPolicy}, the handler throws a
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * runtime {@link RejectedExecutionException} upon rejection. </li>
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> In {@link
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor.CallerRunsPolicy}, the thread that invokes
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tt>execute</tt> itself runs the task. This provides a simple
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * feedback control mechanism that will slow down the rate that new
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tasks are submitted. </li>
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> In {@link ThreadPoolExecutor.DiscardPolicy},
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a task that cannot be executed is simply dropped.  </li>
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>In {@link
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor.DiscardOldestPolicy}, if the executor is not
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shut down, the task at the head of the work queue is dropped, and
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then execution is retried (which can fail again, causing this to be
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * repeated.) </li>
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol>
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is possible to define and use other kinds of {@link
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RejectedExecutionHandler} classes. Doing so requires some care
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * especially when policies are designed to work only under particular
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity or queuing policies. </dd>
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Hook methods</dt>
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>This class provides <tt>protected</tt> overridable {@link
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#beforeExecute} and {@link
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#afterExecute} methods that are called before and
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after execution of each task.  These can be used to manipulate the
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * execution environment, for example, reinitializing ThreadLocals,
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * gathering statistics, or adding log entries. Additionally, method
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link ThreadPoolExecutor#terminated} can be overridden to perform
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * any special processing that needs to be done once the Executor has
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fully terminated.</dd>
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>Queue maintenance</dt>
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd> Method {@link ThreadPoolExecutor#getQueue} allows access to
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the work queue for purposes of monitoring and debugging.  Use of
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this method for any other purpose is strongly discouraged.  Two
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * supplied methods, {@link ThreadPoolExecutor#remove} and {@link
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadPoolExecutor#purge} are available to assist in storage
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reclamation when large numbers of queued tasks become
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * cancelled.</dd> </dl>
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> <b>Extension example</b>. Most extensions of this class
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * override one or more of the protected hook methods. For example,
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * here is a subclass that adds a simple pause/resume feature:
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class PausableThreadPoolExecutor extends ThreadPoolExecutor {
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   private boolean isPaused;
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   private ReentrantLock pauseLock = new ReentrantLock();
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   private Condition unpaused = pauseLock.newCondition();
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   public PausableThreadPoolExecutor(...) { super(...); }
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   protected void beforeExecute(Thread t, Runnable r) {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     super.beforeExecute(t, r);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     pauseLock.lock();
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     try {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       while (isPaused) unpaused.await();
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     } catch(InterruptedException ie) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       t.interrupt();
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     } finally {
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       pauseLock.unlock();
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   }
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   public void pause() {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     pauseLock.lock();
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     try {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       isPaused = true;
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     } finally {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       pauseLock.unlock();
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   public void resume() {
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     pauseLock.lock();
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     try {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       isPaused = false;
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       unpaused.signalAll();
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     } finally {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       pauseLock.unlock();
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ThreadPoolExecutor extends AbstractExecutorService {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Only used to force toArray() to produce a Runnable[].
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Runnable[] EMPTY_RUNNABLE_ARRAY = new Runnable[0];
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Permission for checking shutdown
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final RuntimePermission shutdownPerm =
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        new RuntimePermission("modifyThread");
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Queue used for holding tasks and handing off to worker threads.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final BlockingQueue<Runnable> workQueue;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Lock held on updates to poolSize, corePoolSize, maximumPoolSize, and
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * workers set.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final ReentrantLock mainLock = new ReentrantLock();
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Wait condition to support awaitTermination
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Condition termination = mainLock.newCondition();
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set containing all worker threads in pool.
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final HashSet<Worker> workers = new HashSet<Worker>();
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Timeout in nanoseconds for idle threads waiting for work.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Threads use this timeout only when there are more than
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * corePoolSize present. Otherwise they wait forever for new work.
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile long  keepAliveTime;
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Core pool size, updated only while holding mainLock,
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * but volatile to allow concurrent readability even
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * during updates.
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile int   corePoolSize;
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Maximum pool size, updated only while holding mainLock
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * but volatile to allow concurrent readability even
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * during updates.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile int   maximumPoolSize;
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Current pool size, updated only while holding mainLock
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * but volatile to allow concurrent readability even
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * during updates.
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile int   poolSize;
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Lifecycle state
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    volatile int runState;
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Special values for runState
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Normal, not-shutdown mode */
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int RUNNING    = 0;
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Controlled shutdown mode */
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int SHUTDOWN   = 1;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Immediate shutdown mode */
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int STOP       = 2;
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Final state */
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int TERMINATED = 3;
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Handler called when saturated or shutdown in execute.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile RejectedExecutionHandler handler;
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Factory for new threads.
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile ThreadFactory threadFactory;
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Tracks largest attained pool size.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int largestPoolSize;
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Counter for completed tasks. Updated only on termination of
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * worker threads.
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private long completedTaskCount;
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The default rejected execution handler
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final RejectedExecutionHandler defaultHandler =
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        new AbortPolicy();
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Invoke the rejected execution handler for the given command.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void reject(Runnable command) {
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        handler.rejectedExecution(command, this);
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Create and return a new thread running firstTask as its first
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * task. Call only while holding mainLock
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param firstTask the task the new thread should run first (or
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * null if none)
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new thread
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Thread addThread(Runnable firstTask) {
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Worker w = new Worker(firstTask);
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Thread t = threadFactory.newThread(w);
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        w.thread = t;
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        workers.add(w);
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int nt = ++poolSize;
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (nt > largestPoolSize)
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            largestPoolSize = nt;
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return t;
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Create and start a new thread running firstTask as its first
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * task, only if fewer than corePoolSize threads are running.
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param firstTask the task the new thread should run first (or
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * null if none)
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true if successful.
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean addIfUnderCorePoolSize(Runnable firstTask) {
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Thread t = null;
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (poolSize < corePoolSize)
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                t = addThread(firstTask);
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (t == null)
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        t.start();
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Create and start a new thread only if fewer than maximumPoolSize
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * threads are running.  The new thread runs as its first task the
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * next task in queue, or if there is none, the given task.
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param firstTask the task the new thread should run first (or
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * null if none)
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return null on failure, else the first task to be run by new thread.
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Runnable addIfUnderMaximumPoolSize(Runnable firstTask) {
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Thread t = null;
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Runnable next = null;
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (poolSize < maximumPoolSize) {
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                next = workQueue.poll();
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (next == null)
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    next = firstTask;
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                t = addThread(next);
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (t == null)
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        t.start();
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return next;
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Get the next task for a worker thread to run.
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the task
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InterruptedException if interrupted while waiting for task
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Runnable getTask() throws InterruptedException {
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (;;) {
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            switch(runState) {
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            case RUNNING: {
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (poolSize <= corePoolSize)   // untimed wait if core
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return workQueue.take();
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                long timeout = keepAliveTime;
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (timeout <= 0) // die immediately for 0 timeout
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Runnable r =  workQueue.poll(timeout, TimeUnit.NANOSECONDS);
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (r != null)
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return r;
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (poolSize > corePoolSize) // timed out
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // else, after timeout, pool shrank so shouldn't die, so retry
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                break;
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            case SHUTDOWN: {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Help drain queue
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Runnable r = workQueue.poll();
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (r != null)
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return r;
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Check if can terminate
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (workQueue.isEmpty()) {
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    interruptIdleWorkers();
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // There could still be delayed tasks in queue.
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Wait for one, re-checking state upon interruption
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return workQueue.take();
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch(InterruptedException ignore) {}
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                break;
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            case STOP:
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            default:
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assert false;
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Wake up all threads that might be waiting for tasks.
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void interruptIdleWorkers() {
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Worker w : workers)
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                w.interruptIfIdle();
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Perform bookkeeping for a terminated worker thread.
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param w the worker
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void workerDone(Worker w) {
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            completedTaskCount += w.completedTasks;
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            workers.remove(w);
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (--poolSize > 0)
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Else, this is the last thread. Deal with potential shutdown.
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int state = runState;
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assert state != TERMINATED;
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (state != STOP) {
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // If there are queued tasks but no threads, create
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // replacement.
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Runnable r = workQueue.poll();
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (r != null) {
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    addThread(r).start();
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return;
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // If there are some (presumably delayed) tasks but
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // none pollable, create an idle replacement to wait.
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!workQueue.isEmpty()) {
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    addThread(null).start();
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return;
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Otherwise, we can exit without replacement
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (state == RUNNING)
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return;
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Either state is STOP, or state is SHUTDOWN and there is
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // no work to do. So we can terminate.
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            termination.signalAll();
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            runState = TERMINATED;
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // fall through to call terminate() outside of lock.
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assert runState == TERMINATED;
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        terminated();
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  Worker threads
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private class Worker implements Runnable {
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The runLock is acquired and released surrounding each task
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * execution. It mainly protects against interrupts that are
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * intended to cancel the worker thread from instead
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * interrupting the task being run.
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final ReentrantLock runLock = new ReentrantLock();
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Initial task to run before entering run loop
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private Runnable firstTask;
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Per thread completed task counter; accumulated
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * into completedTaskCount upon termination.
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        volatile long completedTasks;
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Thread this worker is running in.  Acts as a final field,
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * but cannot be set until thread is created.
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Thread thread;
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Worker(Runnable firstTask) {
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.firstTask = firstTask;
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean isActive() {
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return runLock.isLocked();
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Interrupt thread if not running a task
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void interruptIfIdle() {
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final ReentrantLock runLock = this.runLock;
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (runLock.tryLock()) {
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    thread.interrupt();
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } finally {
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    runLock.unlock();
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Cause thread to die even if running a task.
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void interruptNow() {
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            thread.interrupt();
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Run a single task between before/after methods.
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void runTask(Runnable task) {
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final ReentrantLock runLock = this.runLock;
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            runLock.lock();
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Abort now if immediate cancel.  Otherwise, we have
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // committed to run this task.
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (runState == STOP)
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return;
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Thread.interrupted(); // clear interrupt status on entry
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                boolean ran = false;
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                beforeExecute(thread, task);
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    task.run();
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ran = true;
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    afterExecute(task, null);
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ++completedTasks;
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch(RuntimeException ex) {
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (!ran)
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        afterExecute(task, ex);
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // Else the exception occurred within
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // afterExecute itself in which case we don't
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // want to call it again.
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw ex;
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } finally {
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                runLock.unlock();
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Main run loop
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void run() {
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Runnable task = firstTask;
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                firstTask = null;
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (task != null || (task = getTask()) != null) {
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    runTask(task);
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    task = null; // unnecessary but can help GC
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch(InterruptedException ie) {
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // fall through
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } finally {
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                workerDone(this);
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Public methods
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new <tt>ThreadPoolExecutor</tt> with the given
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * initial parameters and default thread factory and handler.  It
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * may be more convenient to use one of the {@link Executors}
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * factory methods instead of this general purpose constructor.
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param corePoolSize the number of threads to keep in the
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool, even if they are idle.
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param maximumPoolSize the maximum number of threads to allow in the
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keepAliveTime when the number of threads is greater than
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the core, this is the maximum time that excess idle threads
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will wait for new tasks before terminating.
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit the time unit for the keepAliveTime
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * argument.
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param workQueue the queue to use for holding tasks before they
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are executed. This queue will hold only the <tt>Runnable</tt>
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tasks submitted by the <tt>execute</tt> method.
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if corePoolSize, or
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * keepAliveTime less than zero, or if maximumPoolSize less than or
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equal to zero, or if corePoolSize greater than maximumPoolSize.
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if <tt>workQueue</tt> is null
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ThreadPoolExecutor(int corePoolSize,
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              int maximumPoolSize,
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              long keepAliveTime,
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              TimeUnit unit,
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              BlockingQueue<Runnable> workQueue) {
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             Executors.defaultThreadFactory(), defaultHandler);
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parameters.
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param corePoolSize the number of threads to keep in the
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool, even if they are idle.
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param maximumPoolSize the maximum number of threads to allow in the
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool.
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keepAliveTime when the number of threads is greater than
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the core, this is the maximum time that excess idle threads
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will wait for new tasks before terminating.
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit the time unit for the keepAliveTime
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * argument.
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param workQueue the queue to use for holding tasks before they
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are executed. This queue will hold only the <tt>Runnable</tt>
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tasks submitted by the <tt>execute</tt> method.
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param threadFactory the factory to use when the executor
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * creates a new thread.
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if corePoolSize, or
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * keepAliveTime less than zero, or if maximumPoolSize less than or
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equal to zero, or if corePoolSize greater than maximumPoolSize.
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if <tt>workQueue</tt>
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or <tt>threadFactory</tt> are null.
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ThreadPoolExecutor(int corePoolSize,
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              int maximumPoolSize,
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              long keepAliveTime,
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              TimeUnit unit,
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              BlockingQueue<Runnable> workQueue,
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              ThreadFactory threadFactory) {
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             threadFactory, defaultHandler);
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parameters.
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param corePoolSize the number of threads to keep in the
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool, even if they are idle.
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param maximumPoolSize the maximum number of threads to allow in the
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool.
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keepAliveTime when the number of threads is greater than
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the core, this is the maximum time that excess idle threads
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will wait for new tasks before terminating.
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit the time unit for the keepAliveTime
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * argument.
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param workQueue the queue to use for holding tasks before they
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are executed. This queue will hold only the <tt>Runnable</tt>
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tasks submitted by the <tt>execute</tt> method.
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param handler the handler to use when execution is blocked
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * because the thread bounds and queue capacities are reached.
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if corePoolSize, or
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * keepAliveTime less than zero, or if maximumPoolSize less than or
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equal to zero, or if corePoolSize greater than maximumPoolSize.
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if <tt>workQueue</tt>
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or  <tt>handler</tt> are null.
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ThreadPoolExecutor(int corePoolSize,
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              int maximumPoolSize,
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              long keepAliveTime,
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              TimeUnit unit,
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              BlockingQueue<Runnable> workQueue,
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              RejectedExecutionHandler handler) {
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             Executors.defaultThreadFactory(), handler);
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new <tt>ThreadPoolExecutor</tt> with the given initial
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parameters.
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param corePoolSize the number of threads to keep in the
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool, even if they are idle.
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param maximumPoolSize the maximum number of threads to allow in the
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pool.
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keepAliveTime when the number of threads is greater than
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the core, this is the maximum time that excess idle threads
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will wait for new tasks before terminating.
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit the time unit for the keepAliveTime
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * argument.
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param workQueue the queue to use for holding tasks before they
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are executed. This queue will hold only the <tt>Runnable</tt>
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tasks submitted by the <tt>execute</tt> method.
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param threadFactory the factory to use when the executor
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * creates a new thread.
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param handler the handler to use when execution is blocked
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * because the thread bounds and queue capacities are reached.
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if corePoolSize, or
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * keepAliveTime less than zero, or if maximumPoolSize less than or
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equal to zero, or if corePoolSize greater than maximumPoolSize.
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if <tt>workQueue</tt>
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or <tt>threadFactory</tt> or <tt>handler</tt> are null.
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ThreadPoolExecutor(int corePoolSize,
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              int maximumPoolSize,
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              long keepAliveTime,
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              TimeUnit unit,
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              BlockingQueue<Runnable> workQueue,
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              ThreadFactory threadFactory,
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              RejectedExecutionHandler handler) {
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (corePoolSize < 0 ||
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumPoolSize <= 0 ||
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumPoolSize < corePoolSize ||
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            keepAliveTime < 0)
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (workQueue == null || threadFactory == null || handler == null)
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.corePoolSize = corePoolSize;
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.maximumPoolSize = maximumPoolSize;
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.workQueue = workQueue;
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.keepAliveTime = unit.toNanos(keepAliveTime);
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.threadFactory = threadFactory;
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.handler = handler;
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Executes the given task sometime in the future.  The task
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * may execute in a new thread or in an existing pooled thread.
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the task cannot be submitted for execution, either because this
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * executor has been shutdown or because its capacity has been reached,
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the task is handled by the current <tt>RejectedExecutionHandler</tt>.
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param command the task to execute
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws RejectedExecutionException at discretion of
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>RejectedExecutionHandler</tt>, if task cannot be accepted
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for execution
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if command is null
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void execute(Runnable command) {
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (command == null)
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (;;) {
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (runState != RUNNING) {
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                reject(command);
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (poolSize < corePoolSize && addIfUnderCorePoolSize(command))
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (workQueue.offer(command))
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Runnable r = addIfUnderMaximumPoolSize(command);
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (r == command)
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (r == null) {
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                reject(command);
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // else retry
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initiates an orderly shutdown in which previously submitted
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tasks are executed, but no new tasks will be
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * accepted. Invocation has no additional effect if already shut
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * down.
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException if a security manager exists and
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * shutting down this ExecutorService may manipulate threads that
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the caller is not permitted to modify because it does not hold
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or the security manager's <tt>checkAccess</tt>  method denies access.
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void shutdown() {
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Fail if caller doesn't have modifyThread permission
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null)
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            java.security.AccessController.checkPermission(shutdownPerm);
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean fullyTerminated = false;
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (workers.size() > 0) {
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Check if caller can modify worker threads.  This
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // might not be true even if passed above check, if
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // the SecurityManager treats some threads specially.
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (security != null) {
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    for (Worker w: workers)
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        security.checkAccess(w.thread);
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int state = runState;
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (state == RUNNING) // don't override shutdownNow
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    runState = SHUTDOWN;
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    for (Worker w: workers)
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        w.interruptIfIdle();
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch(SecurityException se) {
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // If SecurityManager allows above checks, but
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // then unexpectedly throws exception when
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // interrupting threads (which it ought not do),
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // back out as cleanly as we can. Some threads may
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // have been killed but we remain in non-shutdown
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // state.
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    runState = state;
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw se;
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else { // If no workers, trigger full termination now
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fullyTerminated = true;
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                runState = TERMINATED;
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                termination.signalAll();
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (fullyTerminated)
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            terminated();
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attempts to stop all actively executing tasks, halts the
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * processing of waiting tasks, and returns a list of the tasks that were
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * awaiting execution.
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>This implementation cancels tasks via {@link
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Thread#interrupt}, so if any tasks mask or fail to respond to
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * interrupts, they may never terminate.
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return list of tasks that never commenced execution
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException if a security manager exists and
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * shutting down this ExecutorService may manipulate threads that
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the caller is not permitted to modify because it does not hold
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or the security manager's <tt>checkAccess</tt> method denies access.
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public List<Runnable> shutdownNow() {
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Almost the same code as shutdown()
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null)
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            java.security.AccessController.checkPermission(shutdownPerm);
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean fullyTerminated = false;
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (workers.size() > 0) {
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (security != null) {
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    for (Worker w: workers)
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        security.checkAccess(w.thread);
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int state = runState;
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (state != TERMINATED)
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    runState = STOP;
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    for (Worker w : workers)
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        w.interruptNow();
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch(SecurityException se) {
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    runState = state; // back out;
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw se;
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else { // If no workers, trigger full termination now
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fullyTerminated = true;
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                runState = TERMINATED;
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                termination.signalAll();
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (fullyTerminated)
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            terminated();
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Arrays.asList(workQueue.toArray(EMPTY_RUNNABLE_ARRAY));
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isShutdown() {
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return runState != RUNNING;
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns true if this executor is in the process of terminating
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * after <tt>shutdown</tt> or <tt>shutdownNow</tt> but has not
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * completely terminated.  This method may be useful for
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * debugging. A return of <tt>true</tt> reported a sufficient
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * period after shutdown may indicate that submitted tasks have
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ignored or suppressed interruption, causing this executor not
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to properly terminate.
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true if terminating but not yet terminated.
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isTerminating() {
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return runState == STOP;
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isTerminated() {
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return runState == TERMINATED;
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean awaitTermination(long timeout, TimeUnit unit)
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException {
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long nanos = unit.toNanos(timeout);
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (runState == TERMINATED)
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nanos <= 0)
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return false;
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nanos = termination.awaitNanos(nanos);
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Invokes <tt>shutdown</tt> when this executor is no longer
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * referenced.
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void finalize()  {
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        shutdown();
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the thread factory used to create new threads.
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param threadFactory the new thread factory
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if threadFactory is null
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getThreadFactory
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setThreadFactory(ThreadFactory threadFactory) {
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (threadFactory == null)
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.threadFactory = threadFactory;
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the thread factory used to create new threads.
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current thread factory
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #setThreadFactory
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ThreadFactory getThreadFactory() {
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return threadFactory;
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets a new handler for unexecutable tasks.
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param handler the new handler
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if handler is null
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getRejectedExecutionHandler
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setRejectedExecutionHandler(RejectedExecutionHandler handler) {
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (handler == null)
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.handler = handler;
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the current handler for unexecutable tasks.
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current handler
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #setRejectedExecutionHandler
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public RejectedExecutionHandler getRejectedExecutionHandler() {
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return handler;
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the task queue used by this executor. Access to the
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * task queue is intended primarily for debugging and monitoring.
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This queue may be in active use.  Retrieving the task queue
1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * does not prevent queued tasks from executing.
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the task queue
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public BlockingQueue<Runnable> getQueue() {
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return workQueue;
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes this task from the executor's internal queue if it is
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * present, thus causing it not to be run if it has not already
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * started.
1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p> This method may be useful as one part of a cancellation
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * scheme.  It may fail to remove tasks that have been converted
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * into other forms before being placed on the internal queue. For
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * example, a task entered using <tt>submit</tt> might be
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * converted into a form that maintains <tt>Future</tt> status.
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * However, in such cases, method {@link ThreadPoolExecutor#purge}
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * may be used to remove those Futures that have been cancelled.
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param task the task to remove
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true if the task was removed
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean remove(Runnable task) {
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getQueue().remove(task);
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Tries to remove from the work queue all {@link Future}
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tasks that have been cancelled. This method can be useful as a
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * storage reclamation operation, that has no other impact on
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * functionality. Cancelled tasks are never executed, but may
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * accumulate in work queues until worker threads can actively
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * remove them. Invoking this method instead tries to remove them now.
1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * However, this method may fail to remove tasks in
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the presence of interference by other threads.
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void purge() {
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Fail if we encounter interference during traversal
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Iterator<Runnable> it = getQueue().iterator();
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Runnable r = it.next();
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (r instanceof Future<?>) {
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Future<?> c = (Future<?>)r;
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (c.isCancelled())
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        it.remove();
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        catch(ConcurrentModificationException ex) {
1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the core number of threads.  This overrides any value set
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the constructor.  If the new value is smaller than the
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * current value, excess existing threads will be terminated when
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they next become idle. If larger, new threads will, if needed,
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be started to execute any queued tasks.
1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param corePoolSize the new core size
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>corePoolSize</tt>
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * less than zero
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getCorePoolSize
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCorePoolSize(int corePoolSize) {
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (corePoolSize < 0)
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int extra = this.corePoolSize - corePoolSize;
1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.corePoolSize = corePoolSize;
1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (extra < 0) {
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Runnable r;
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (extra++ < 0 && poolSize < corePoolSize &&
1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                       (r = workQueue.poll()) != null)
1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    addThread(r).start();
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else if (extra > 0 && poolSize > corePoolSize) {
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Iterator<Worker> it = workers.iterator();
1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (it.hasNext() &&
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                       extra-- > 0 &&
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                       poolSize > corePoolSize &&
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                       workQueue.remainingCapacity() == 0)
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    it.next().interruptIfIdle();
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the core number of threads.
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the core number of threads
1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #setCorePoolSize
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getCorePoolSize() {
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return corePoolSize;
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Starts a core thread, causing it to idly wait for work. This
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * overrides the default policy of starting core threads only when
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * new tasks are executed. This method will return <tt>false</tt>
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * if all core threads have already been started.
1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true if a thread was started
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean prestartCoreThread() {
1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return addIfUnderCorePoolSize(null);
1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Starts all core threads, causing them to idly wait for work. This
1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * overrides the default policy of starting core threads only when
1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * new tasks are executed.
1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of threads started.
1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int prestartAllCoreThreads() {
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int n = 0;
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (addIfUnderCorePoolSize(null))
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ++n;
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return n;
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the maximum allowed number of threads. This overrides any
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value set in the constructor. If the new value is smaller than
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the current value, excess existing threads will be
1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * terminated when they next become idle.
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param maximumPoolSize the new maximum
1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if maximumPoolSize less than zero or
1226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #getCorePoolSize core pool size}
1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getMaximumPoolSize
1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumPoolSize(int maximumPoolSize) {
1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int extra = this.maximumPoolSize - maximumPoolSize;
1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.maximumPoolSize = maximumPoolSize;
1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (extra > 0 && poolSize > maximumPoolSize) {
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Iterator<Worker> it = workers.iterator();
1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (it.hasNext() &&
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                       extra > 0 &&
1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                       poolSize > maximumPoolSize) {
1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    it.next().interruptIfIdle();
1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    --extra;
1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the maximum allowed number of threads.
1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the maximum allowed number of threads
1255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #setMaximumPoolSize
1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumPoolSize() {
1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return maximumPoolSize;
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the time limit for which threads may remain idle before
1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * being terminated.  If there are more than the core number of
1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * threads currently in the pool, after waiting this amount of
1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * time without processing a task, excess threads will be
1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * terminated.  This overrides any value set in the constructor.
1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param time the time to wait.  A time value of zero will cause
1268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * excess threads to terminate immediately after executing tasks.
1269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit  the time unit of the time argument
1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if time less than zero
1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getKeepAliveTime
1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setKeepAliveTime(long time, TimeUnit unit) {
1274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (time < 0)
1275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
1276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.keepAliveTime = unit.toNanos(time);
1277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the thread keep-alive time, which is the amount of time
1281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * which threads in excess of the core pool size may remain
1282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * idle before being terminated.
1283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit the desired time unit of the result
1285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the time limit
1286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #setKeepAliveTime
1287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getKeepAliveTime(TimeUnit unit) {
1289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return unit.convert(keepAliveTime, TimeUnit.NANOSECONDS);
1290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /* Statistics */
1293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the current number of threads in the pool.
1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of threads
1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getPoolSize() {
1300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return poolSize;
1301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the approximate number of threads that are actively
1305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * executing tasks.
1306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of threads
1308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getActiveCount() {
1310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int n = 0;
1314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Worker w : workers) {
1315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (w.isActive())
1316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ++n;
1317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n;
1319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the largest number of threads that have ever
1326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * simultaneously been in the pool.
1327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of threads
1329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLargestPoolSize() {
1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return largestPoolSize;
1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the approximate total number of tasks that have been
1342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * scheduled for execution. Because the states of tasks and
1343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * threads may change dynamically during computation, the returned
1344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is only an approximation, but one that does not ever
1345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * decrease across successive calls.
1346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of tasks
1348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getTaskCount() {
1350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long n = completedTaskCount;
1354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Worker w : workers) {
1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                n += w.completedTasks;
1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (w.isActive())
1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ++n;
1358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n + workQueue.size();
1360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the approximate total number of tasks that have
1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * completed execution. Because the states of tasks and threads
1368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * may change dynamically during computation, the returned value
1369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is only an approximation, but one that does not ever decrease
1370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * across successive calls.
1371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of tasks
1373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getCompletedTaskCount() {
1375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock mainLock = this.mainLock;
1376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mainLock.lock();
1377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long n = completedTaskCount;
1379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Worker w : workers)
1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                n += w.completedTasks;
1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n;
1382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mainLock.unlock();
1384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Method invoked prior to executing the given Runnable in the
1389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given thread.  This method is invoked by thread <tt>t</tt> that
1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will execute task <tt>r</tt>, and may be used to re-initialize
1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ThreadLocals, or to perform logging. Note: To properly nest
1392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * multiple overridings, subclasses should generally invoke
1393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>super.beforeExecute</tt> at the end of this method.
1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param t the thread that will run task r.
1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param r the task that will be executed.
1397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void beforeExecute(Thread t, Runnable r) { }
1399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Method invoked upon completion of execution of the given
1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Runnable.  This method is invoked by the thread that executed
1403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the task. If non-null, the Throwable is the uncaught exception
1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that caused execution to terminate abruptly. Note: To properly
1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * nest multiple overridings, subclasses should generally invoke
1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>super.afterExecute</tt> at the beginning of this method.
1407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param r the runnable that has completed.
1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param t the exception that caused termination, or null if
1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * execution completed normally.
1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void afterExecute(Runnable r, Throwable t) { }
1413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Method invoked when the Executor has terminated.  Default
1416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation does nothing. Note: To properly nest multiple
1417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * overridings, subclasses should generally invoke
1418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>super.terminated</tt> within this method.
1419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void terminated() { }
1421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A handler for rejected tasks that runs the rejected task
1424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * directly in the calling thread of the <tt>execute</tt> method,
1425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unless the executor has been shut down, in which case the task
1426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is discarded.
1427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   public static class CallerRunsPolicy implements RejectedExecutionHandler {
1429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Creates a <tt>CallerRunsPolicy</tt>.
1431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public CallerRunsPolicy() { }
1433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Executes task r in the caller's thread, unless the executor
1436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * has been shut down, in which case the task is discarded.
1437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param r the runnable task requested to be executed
1438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param e the executor attempting to execute this task
1439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
1441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!e.isShutdown()) {
1442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                r.run();
1443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A handler for rejected tasks that throws a
1449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>RejectedExecutionException</tt>.
1450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class AbortPolicy implements RejectedExecutionHandler {
1452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Creates an <tt>AbortPolicy</tt>.
1454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public AbortPolicy() { }
1456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Always throws RejectedExecutionException.
1459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param r the runnable task requested to be executed
1460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param e the executor attempting to execute this task
1461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws RejectedExecutionException always.
1462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
1464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RejectedExecutionException();
1465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A handler for rejected tasks that silently discards the
1470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * rejected task.
1471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class DiscardPolicy implements RejectedExecutionHandler {
1473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Creates a <tt>DiscardPolicy</tt>.
1475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public DiscardPolicy() { }
1477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Does nothing, which has the effect of discarding task r.
1480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param r the runnable task requested to be executed
1481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param e the executor attempting to execute this task
1482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
1484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A handler for rejected tasks that discards the oldest unhandled
1489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * request and then retries <tt>execute</tt>, unless the executor
1490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is shut down, in which case the task is discarded.
1491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
1493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Creates a <tt>DiscardOldestPolicy</tt> for the given executor.
1495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public DiscardOldestPolicy() { }
1497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Obtains and ignores the next task that the executor
1500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * would otherwise execute, if one is immediately available,
1501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * and then retries execution of task r, unless the executor
1502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * is shut down, in which case task r is instead discarded.
1503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param r the runnable task requested to be executed
1504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param e the executor attempting to execute this task
1505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
1507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!e.isShutdown()) {
1508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                e.getQueue().poll();
1509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                e.execute(r);
1510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1514