ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/concurrent/ExecutorService.java
Revision: 1.53
Committed: Thu Jun 9 07:48:43 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.52: +4 -6 lines
Log Message:
consistent style for code snippets

File Contents

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