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