1/*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 */
6
7package java.util.concurrent;
8
9import java.util.Collection;
10import java.util.List;
11
12// BEGIN android-note
13// removed security manager docs
14// END android-note
15
16/**
17 * An {@link Executor} that provides methods to manage termination and
18 * methods that can produce a {@link Future} for tracking progress of
19 * one or more asynchronous tasks.
20 *
21 * <p>An {@code ExecutorService} can be shut down, which will cause
22 * it to reject new tasks.  Two different methods are provided for
23 * shutting down an {@code ExecutorService}. The {@link #shutdown}
24 * method will allow previously submitted tasks to execute before
25 * terminating, while the {@link #shutdownNow} method prevents waiting
26 * tasks from starting and attempts to stop currently executing tasks.
27 * Upon termination, an executor has no tasks actively executing, no
28 * tasks awaiting execution, and no new tasks can be submitted.  An
29 * unused {@code ExecutorService} should be shut down to allow
30 * reclamation of its resources.
31 *
32 * <p>Method {@code submit} extends base method {@link
33 * Executor#execute(Runnable)} by creating and returning a {@link Future}
34 * that can be used to cancel execution and/or wait for completion.
35 * Methods {@code invokeAny} and {@code invokeAll} perform the most
36 * commonly useful forms of bulk execution, executing a collection of
37 * tasks and then waiting for at least one, or all, to
38 * complete. (Class {@link ExecutorCompletionService} can be used to
39 * write customized variants of these methods.)
40 *
41 * <p>The {@link Executors} class provides factory methods for the
42 * executor services provided in this package.
43 *
44 * <h3>Usage Examples</h3>
45 *
46 * Here is a sketch of a network service in which threads in a thread
47 * pool service incoming requests. It uses the preconfigured {@link
48 * Executors#newFixedThreadPool} factory method:
49 *
50 * <pre> {@code
51 * class NetworkService implements Runnable {
52 *   private final ServerSocket serverSocket;
53 *   private final ExecutorService pool;
54 *
55 *   public NetworkService(int port, int poolSize)
56 *       throws IOException {
57 *     serverSocket = new ServerSocket(port);
58 *     pool = Executors.newFixedThreadPool(poolSize);
59 *   }
60 *
61 *   public void run() { // run the service
62 *     try {
63 *       for (;;) {
64 *         pool.execute(new Handler(serverSocket.accept()));
65 *       }
66 *     } catch (IOException ex) {
67 *       pool.shutdown();
68 *     }
69 *   }
70 * }
71 *
72 * class Handler implements Runnable {
73 *   private final Socket socket;
74 *   Handler(Socket socket) { this.socket = socket; }
75 *   public void run() {
76 *     // read and service request on socket
77 *   }
78 * }}</pre>
79 *
80 * The following method shuts down an {@code ExecutorService} in two phases,
81 * first by calling {@code shutdown} to reject incoming tasks, and then
82 * calling {@code shutdownNow}, if necessary, to cancel any lingering tasks:
83 *
84 * <pre> {@code
85 * void shutdownAndAwaitTermination(ExecutorService pool) {
86 *   pool.shutdown(); // Disable new tasks from being submitted
87 *   try {
88 *     // Wait a while for existing tasks to terminate
89 *     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
90 *       pool.shutdownNow(); // Cancel currently executing tasks
91 *       // Wait a while for tasks to respond to being cancelled
92 *       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
93 *           System.err.println("Pool did not terminate");
94 *     }
95 *   } catch (InterruptedException ie) {
96 *     // (Re-)Cancel if current thread also interrupted
97 *     pool.shutdownNow();
98 *     // Preserve interrupt status
99 *     Thread.currentThread().interrupt();
100 *   }
101 * }}</pre>
102 *
103 * <p>Memory consistency effects: Actions in a thread prior to the
104 * submission of a {@code Runnable} or {@code Callable} task to an
105 * {@code ExecutorService}
106 * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
107 * any actions taken by that task, which in turn <i>happen-before</i> the
108 * result is retrieved via {@code Future.get()}.
109 *
110 * @since 1.5
111 * @author Doug Lea
112 */
113public interface ExecutorService extends Executor {
114
115    /**
116     * Initiates an orderly shutdown in which previously submitted
117     * tasks are executed, but no new tasks will be accepted.
118     * Invocation has no additional effect if already shut down.
119     *
120     * <p>This method does not wait for previously submitted tasks to
121     * complete execution.  Use {@link #awaitTermination awaitTermination}
122     * to do that.
123     */
124    void shutdown();
125
126    /**
127     * Attempts to stop all actively executing tasks, halts the
128     * processing of waiting tasks, and returns a list of the tasks
129     * that were awaiting execution.
130     *
131     * <p>This method does not wait for actively executing tasks to
132     * terminate.  Use {@link #awaitTermination awaitTermination} to
133     * do that.
134     *
135     * <p>There are no guarantees beyond best-effort attempts to stop
136     * processing actively executing tasks.  For example, typical
137     * implementations will cancel via {@link Thread#interrupt}, so any
138     * task that fails to respond to interrupts may never terminate.
139     *
140     * @return list of tasks that never commenced execution
141     */
142    List<Runnable> shutdownNow();
143
144    /**
145     * Returns {@code true} if this executor has been shut down.
146     *
147     * @return {@code true} if this executor has been shut down
148     */
149    boolean isShutdown();
150
151    /**
152     * Returns {@code true} if all tasks have completed following shut down.
153     * Note that {@code isTerminated} is never {@code true} unless
154     * either {@code shutdown} or {@code shutdownNow} was called first.
155     *
156     * @return {@code true} if all tasks have completed following shut down
157     */
158    boolean isTerminated();
159
160    /**
161     * Blocks until all tasks have completed execution after a shutdown
162     * request, or the timeout occurs, or the current thread is
163     * interrupted, whichever happens first.
164     *
165     * @param timeout the maximum time to wait
166     * @param unit the time unit of the timeout argument
167     * @return {@code true} if this executor terminated and
168     *         {@code false} if the timeout elapsed before termination
169     * @throws InterruptedException if interrupted while waiting
170     */
171    boolean awaitTermination(long timeout, TimeUnit unit)
172        throws InterruptedException;
173
174    /**
175     * Submits a value-returning task for execution and returns a
176     * Future representing the pending results of the task. The
177     * Future's {@code get} method will return the task's result upon
178     * successful completion.
179     *
180     * <p>
181     * If you would like to immediately block waiting
182     * for a task, you can use constructions of the form
183     * {@code result = exec.submit(aCallable).get();}
184     *
185     * <p>Note: The {@link Executors} class includes a set of methods
186     * that can convert some other common closure-like objects,
187     * for example, {@link java.security.PrivilegedAction} to
188     * {@link Callable} form so they can be submitted.
189     *
190     * @param task the task to submit
191     * @param <T> the type of the task's result
192     * @return a Future representing pending completion of the task
193     * @throws RejectedExecutionException if the task cannot be
194     *         scheduled for execution
195     * @throws NullPointerException if the task is null
196     */
197    <T> Future<T> submit(Callable<T> task);
198
199    /**
200     * Submits a Runnable task for execution and returns a Future
201     * representing that task. The Future's {@code get} method will
202     * return the given result upon successful completion.
203     *
204     * @param task the task to submit
205     * @param result the result to return
206     * @param <T> the type of the result
207     * @return a Future representing pending completion of the task
208     * @throws RejectedExecutionException if the task cannot be
209     *         scheduled for execution
210     * @throws NullPointerException if the task is null
211     */
212    <T> Future<T> submit(Runnable task, T result);
213
214    /**
215     * Submits a Runnable task for execution and returns a Future
216     * representing that task. The Future's {@code get} method will
217     * return {@code null} upon <em>successful</em> completion.
218     *
219     * @param task the task to submit
220     * @return a Future representing pending completion of the task
221     * @throws RejectedExecutionException if the task cannot be
222     *         scheduled for execution
223     * @throws NullPointerException if the task is null
224     */
225    Future<?> submit(Runnable task);
226
227    /**
228     * Executes the given tasks, returning a list of Futures holding
229     * their status and results when all complete.
230     * {@link Future#isDone} is {@code true} for each
231     * element of the returned list.
232     * Note that a <em>completed</em> task could have
233     * terminated either normally or by throwing an exception.
234     * The results of this method are undefined if the given
235     * collection is modified while this operation is in progress.
236     *
237     * @param tasks the collection of tasks
238     * @param <T> the type of the values returned from the tasks
239     * @return a list of Futures representing the tasks, in the same
240     *         sequential order as produced by the iterator for the
241     *         given task list, each of which has completed
242     * @throws InterruptedException if interrupted while waiting, in
243     *         which case unfinished tasks are cancelled
244     * @throws NullPointerException if tasks or any of its elements are {@code null}
245     * @throws RejectedExecutionException if any task cannot be
246     *         scheduled for execution
247     */
248    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
249        throws InterruptedException;
250
251    /**
252     * Executes the given tasks, returning a list of Futures holding
253     * their status and results
254     * when all complete or the timeout expires, whichever happens first.
255     * {@link Future#isDone} is {@code true} for each
256     * element of the returned list.
257     * Upon return, tasks that have not completed are cancelled.
258     * Note that a <em>completed</em> task could have
259     * terminated either normally or by throwing an exception.
260     * The results of this method are undefined if the given
261     * collection is modified while this operation is in progress.
262     *
263     * @param tasks the collection of tasks
264     * @param timeout the maximum time to wait
265     * @param unit the time unit of the timeout argument
266     * @param <T> the type of the values returned from the tasks
267     * @return a list of Futures representing the tasks, in the same
268     *         sequential order as produced by the iterator for the
269     *         given task list. If the operation did not time out,
270     *         each task will have completed. If it did time out, some
271     *         of these tasks will not have completed.
272     * @throws InterruptedException if interrupted while waiting, in
273     *         which case unfinished tasks are cancelled
274     * @throws NullPointerException if tasks, any of its elements, or
275     *         unit are {@code null}
276     * @throws RejectedExecutionException if any task cannot be scheduled
277     *         for execution
278     */
279    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
280                                  long timeout, TimeUnit unit)
281        throws InterruptedException;
282
283    /**
284     * Executes the given tasks, returning the result
285     * of one that has completed successfully (i.e., without throwing
286     * an exception), if any do. Upon normal or exceptional return,
287     * tasks that have not completed are cancelled.
288     * The results of this method are undefined if the given
289     * collection is modified while this operation is in progress.
290     *
291     * @param tasks the collection of tasks
292     * @param <T> the type of the values returned from the tasks
293     * @return the result returned by one of the tasks
294     * @throws InterruptedException if interrupted while waiting
295     * @throws NullPointerException if tasks or any element task
296     *         subject to execution is {@code null}
297     * @throws IllegalArgumentException if tasks is empty
298     * @throws ExecutionException if no task successfully completes
299     * @throws RejectedExecutionException if tasks cannot be scheduled
300     *         for execution
301     */
302    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
303        throws InterruptedException, ExecutionException;
304
305    /**
306     * Executes the given tasks, returning the result
307     * of one that has completed successfully (i.e., without throwing
308     * an exception), if any do before the given timeout elapses.
309     * Upon normal or exceptional return, tasks that have not
310     * completed are cancelled.
311     * The results of this method are undefined if the given
312     * collection is modified while this operation is in progress.
313     *
314     * @param tasks the collection of tasks
315     * @param timeout the maximum time to wait
316     * @param unit the time unit of the timeout argument
317     * @param <T> the type of the values returned from the tasks
318     * @return the result returned by one of the tasks
319     * @throws InterruptedException if interrupted while waiting
320     * @throws NullPointerException if tasks, or unit, or any element
321     *         task subject to execution is {@code null}
322     * @throws TimeoutException if the given timeout elapses before
323     *         any task successfully completes
324     * @throws ExecutionException if no task successfully completes
325     * @throws RejectedExecutionException if tasks cannot be scheduled
326     *         for execution
327     */
328    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
329                    long timeout, TimeUnit unit)
330        throws InterruptedException, ExecutionException, TimeoutException;
331}
332