ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166x/BlockingDeque.java
Revision: 1.5
Committed: Sat Dec 29 23:55:19 2012 UTC (11 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.4: +25 -25 lines
Log Message:
punctuation

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 jsr166x; // XXX This belongs in java.util!!! XXX
8 import java.util.concurrent.*; // XXX This import goes away XXX
9 import java.util.*;
10
11 /**
12 * A {@link Deque} that additionally supports operations that wait for
13 * the deque to become non-empty when retrieving an element, and wait
14 * for space to become available in the deque when storing an
15 * element. These methods are summarized in the following table:<p>
16 *
17 * <table BORDER CELLPADDING=3 CELLSPACING=1>
18 * <tr>
19 * <td></td>
20 * <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td>
21 * <td ALIGN=CENTER COLSPAN = 2> <b>Last Element (Tail)</b></td>
22 * </tr>
23 * <tr>
24 * <td></td>
25 * <td ALIGN=CENTER><em>Block</em></td>
26 * <td ALIGN=CENTER><em>Time out</em></td>
27 * <td ALIGN=CENTER><em>Block</em></td>
28 * <td ALIGN=CENTER><em>Time out</em></td>
29 * </tr>
30 * <tr>
31 * <td><b>Insert</b></td>
32 * <td>{@link #putFirst putFirst(e)}</td>
33 * <td>{@link #offerFirst(Object, long, TimeUnit) offerFirst(e, time, unit)}</td>
34 * <td>{@link #putLast putLast(e)}</td>
35 * <td>{@link #offerLast(Object, long, TimeUnit) offerLast(e, time, unit)}</td>
36 * </tr>
37 * <tr>
38 * <td><b>Remove</b></td>
39 * <td>{@link #takeFirst takeFirst()}</td>
40 * <td>{@link #pollFirst(long, TimeUnit) pollFirst(time, unit)}</td>
41 * <td>{@link #takeLast takeLast()}</td>
42 * <td>{@link #pollLast(long, TimeUnit) pollLast(time, unit)}</td>
43 * </tr>
44 * </table>
45 *
46 * <p>Like any {@link BlockingQueue}, a <tt>BlockingDeque</tt> is
47 * thread safe and may (or may not) be capacity-constrained. A
48 * <tt>BlockingDeque</tt> implementation may be used directly as a
49 * FIFO <tt>BlockingQueue</tt>. The blocking methods inherited from
50 * the <tt>BlockingQueue</tt> interface are precisely equivalent to
51 * <tt>BlockingDeque</tt> methods as indicated in the following table:<p>
52 *
53 * <table BORDER CELLPADDING=3 CELLSPACING=1>
54 * <tr>
55 * <td ALIGN=CENTER> <b><tt>BlockingQueue</tt> Method</b></td>
56 * <td ALIGN=CENTER> <b>Equivalent <tt>BlockingDeque</tt> Method</b></td>
57 * </tr>
58 * <tr>
59 * <tr>
60 * <td>{@link java.util.concurrent.BlockingQueue#put put(e)}</td>
61 * <td>{@link #putLast putLast(e)}</td>
62 * </tr>
63 * <tr>
64 * <td>{@link java.util.concurrent.BlockingQueue#take take()}</td>
65 * <td>{@link #takeFirst takeFirst()}</td>
66 * </tr>
67 * <tr>
68 * <td>{@link java.util.concurrent.BlockingQueue#offer(Object, long, TimeUnit) offer(e, time. unit)}</td>
69 * <td>{@link #offerLast(Object, long, TimeUnit) offerLast(e, time, unit)}</td>
70 * </tr>
71 * <tr>
72 * <td>{@link java.util.concurrent.BlockingQueue#poll(long, TimeUnit) poll(time, unit)}</td>
73 * <td>{@link #pollFirst(long, TimeUnit) pollFirst(time, unit)}</td>
74 * </tr>
75 * </table>
76 *
77 *
78 * <p>This interface is a member of the
79 * <a href="{@docRoot}/../guide/collections/index.html">
80 * Java Collections Framework</a>.
81 *
82 * @since 1.6
83 * @author Doug Lea
84 * @param <E> the type of elements held in this collection
85 */
86 public interface BlockingDeque<E> extends Deque<E>, BlockingQueue<E> {
87
88 /**
89 * Adds the specified element as the first element of this deque,
90 * waiting if necessary for space to become available.
91 * @param o the element to add
92 * @throws InterruptedException if interrupted while waiting
93 * @throws NullPointerException if the specified element is <tt>null</tt>
94 */
95 void putFirst(E o) throws InterruptedException;
96
97 /**
98 * Adds the specified element as the last element of this deque,
99 * waiting if necessary for space to become available.
100 * @param o the element to add
101 * @throws InterruptedException if interrupted while waiting
102 * @throws NullPointerException if the specified element is <tt>null</tt>
103 */
104 void putLast(E o) throws InterruptedException;
105
106 /**
107 * Retrieves and removes the first element of this deque, waiting
108 * if no elements are present on this deque.
109 * @return the head of this deque
110 * @throws InterruptedException if interrupted while waiting
111 */
112 E takeFirst() throws InterruptedException;
113
114 /**
115 * Retrieves and removes the last element of this deque, waiting
116 * if no elements are present on this deque.
117 * @return the head of this deque
118 * @throws InterruptedException if interrupted while waiting
119 */
120 E takeLast() throws InterruptedException;
121
122 /**
123 * Inserts the specified element as the first element of this deque,
124 * waiting if necessary up to the specified wait time for space to
125 * become available.
126 * @param o the element to add
127 * @param timeout how long to wait before giving up, in units of
128 * <tt>unit</tt>
129 * @param unit a <tt>TimeUnit</tt> determining how to interpret the
130 * <tt>timeout</tt> parameter
131 * @return <tt>true</tt> if successful, or <tt>false</tt> if
132 * the specified waiting time elapses before space is available
133 * @throws InterruptedException if interrupted while waiting
134 * @throws NullPointerException if the specified element is <tt>null</tt>
135 */
136 boolean offerFirst(E o, long timeout, TimeUnit unit)
137 throws InterruptedException;
138
139 /**
140 * Inserts the specified element as the last element of this deque,
141 * waiting if necessary up to the specified wait time for space to
142 * become available.
143 * @param o the element to add
144 * @param timeout how long to wait before giving up, in units of
145 * <tt>unit</tt>
146 * @param unit a <tt>TimeUnit</tt> determining how to interpret the
147 * <tt>timeout</tt> parameter
148 * @return <tt>true</tt> if successful, or <tt>false</tt> if
149 * the specified waiting time elapses before space is available
150 * @throws InterruptedException if interrupted while waiting
151 * @throws NullPointerException if the specified element is <tt>null</tt>
152 */
153 boolean offerLast(E o, long timeout, TimeUnit unit)
154 throws InterruptedException;
155
156
157 /**
158 * Retrieves and removes the first element of this deque, waiting
159 * if necessary up to the specified wait time if no elements are
160 * present on this deque.
161 * @param timeout how long to wait before giving up, in units of
162 * <tt>unit</tt>
163 * @param unit a <tt>TimeUnit</tt> determining how to interpret the
164 * <tt>timeout</tt> parameter
165 * @return the head of this deque, or <tt>null</tt> if the
166 * specified waiting time elapses before an element is present
167 * @throws InterruptedException if interrupted while waiting
168 */
169 E pollFirst(long timeout, TimeUnit unit)
170 throws InterruptedException;
171
172 /**
173 * Retrieves and removes the last element of this deque, waiting
174 * if necessary up to the specified wait time if no elements are
175 * present on this deque.
176 * @param timeout how long to wait before giving up, in units of
177 * <tt>unit</tt>
178 * @param unit a <tt>TimeUnit</tt> determining how to interpret the
179 * <tt>timeout</tt> parameter
180 * @return the head of this deque, or <tt>null</tt> if the
181 * specified waiting time elapses before an element is present
182 * @throws InterruptedException if interrupted while waiting
183 */
184 E pollLast(long timeout, TimeUnit unit)
185 throws InterruptedException;
186
187 /**
188 * Adds the specified element as the last element of this deque,
189 * waiting if necessary for space to become available. This
190 * method is equivalent to putLast
191 * @param o the element to add
192 * @throws InterruptedException if interrupted while waiting
193 * @throws NullPointerException if the specified element is <tt>null</tt>
194 */
195 void put(E o) throws InterruptedException;
196
197 /**
198 * Inserts the specified element as the lest element of this
199 * deque, if possible. When using deques that may impose
200 * insertion restrictions (for example capacity bounds), method
201 * <tt>offer</tt> is generally preferable to method {@link
202 * Collection#add}, which can fail to insert an element only by
203 * throwing an exception. This method is equivalent to
204 * offerLast.
205 *
206 * @param o the element to add
207 * @return <tt>true</tt> if it was possible to add the element to
208 * this deque, else <tt>false</tt>
209 * @throws NullPointerException if the specified element is <tt>null</tt>
210 */
211 boolean offer(E o, long timeout, TimeUnit unit)
212 throws InterruptedException;
213
214 /**
215 * Retrieves and removes the first element of this deque, waiting
216 * if no elements are present on this deque.
217 * This method is equivalent to takeFirst.
218 * @return the head of this deque
219 * @throws InterruptedException if interrupted while waiting
220 */
221 E take() throws InterruptedException;
222
223 /**
224 * Retrieves and removes the first element of this deque, waiting
225 * if necessary up to the specified wait time if no elements are
226 * present on this deque. This method is equivalent to
227 * pollFirst.
228 * @param timeout how long to wait before giving up, in units of
229 * <tt>unit</tt>
230 * @param unit a <tt>TimeUnit</tt> determining how to interpret the
231 * <tt>timeout</tt> parameter
232 * @return the head of this deque, or <tt>null</tt> if the
233 * specified waiting time elapses before an element is present
234 * @throws InterruptedException if interrupted while waiting
235 */
236 E poll(long timeout, TimeUnit unit)
237 throws InterruptedException;
238 }