01: /*
02: * Written by Doug Lea with assistance from members of JCP JSR-166
03: * Expert Group and released to the public domain, as explained at
04: * http://creativecommons.org/licenses/publicdomain
05: */
06:
07: package java.util.concurrent;
08:
09: /**
10: * A service that decouples the production of new asynchronous tasks
11: * from the consumption of the results of completed tasks. Producers
12: * <tt>submit</tt> tasks for execution. Consumers <tt>take</tt>
13: * completed tasks and process their results in the order they
14: * complete. A <tt>CompletionService</tt> can for example be used to
15: * manage asynchronous IO, in which tasks that perform reads are
16: * submitted in one part of a program or system, and then acted upon
17: * in a different part of the program when the reads complete,
18: * possibly in a different order than they were requested.
19:
20: * <p>
21: *
22: * Typically, a <tt>CompletionService</tt> relies on a separate {@link
23: * Executor} to actually execute the tasks, in which case the
24: * <tt>CompletionService</tt> only manages an internal completion
25: * queue. The {@link ExecutorCompletionService} class provides an
26: * implementation of this approach.
27: *
28: */
29: public interface CompletionService<V> {
30: /**
31: * Submits a value-returning task for execution and returns a Future
32: * representing the pending results of the task. Upon completion,
33: * this task may be taken or polled.
34: *
35: * @param task the task to submit
36: * @return a Future representing pending completion of the task
37: * @throws RejectedExecutionException if task cannot be scheduled
38: * for execution
39: * @throws NullPointerException if task null
40: */
41: Future<V> submit(Callable<V> task);
42:
43: /**
44: * Submits a Runnable task for execution and returns a Future
45: * representing that task. Upon completion,
46: * this task may be taken or polled.
47: *
48: * @param task the task to submit
49: * @param result the result to return upon successful completion
50: * @return a Future representing pending completion of the task,
51: * and whose <tt>get()</tt> method will return the given result value
52: * upon completion
53: * @throws RejectedExecutionException if task cannot be scheduled
54: * for execution
55: * @throws NullPointerException if task null
56: */
57: Future<V> submit(Runnable task, V result);
58:
59: /**
60: * Retrieves and removes the Future representing the next
61: * completed task, waiting if none are yet present.
62: * @return the Future representing the next completed task
63: * @throws InterruptedException if interrupted while waiting.
64: */
65: Future<V> take() throws InterruptedException;
66:
67: /**
68: * Retrieves and removes the Future representing the next
69: * completed task or <tt>null</tt> if none are present.
70: *
71: * @return the Future representing the next completed task, or
72: * <tt>null</tt> if none are present.
73: */
74: Future<V> poll();
75:
76: /**
77: * Retrieves and removes the Future representing the next
78: * completed task, waiting if necessary up to the specified wait
79: * time if none are yet present.
80: * @param timeout how long to wait before giving up, in units of
81: * <tt>unit</tt>
82: * @param unit a <tt>TimeUnit</tt> determining how to interpret the
83: * <tt>timeout</tt> parameter
84: * @return the Future representing the next completed task or
85: * <tt>null</tt> if the specified waiting time elapses before one
86: * is present.
87: * @throws InterruptedException if interrupted while waiting.
88: */
89: Future<V> poll(long timeout, TimeUnit unit)
90: throws InterruptedException;
91: }
|