01: package org.swingml.task;
02:
03: import java.util.*;
04:
05: /**
06: * A (very) simple queue implementation that simply assumes that external clients
07: * can manage queue size to ensure there is no overflow, and minimal blocking on
08: * either side.
09: *
10: * @author CrossLogic
11: */
12: public class UnboundedQueue {
13:
14: List elements = new ArrayList();
15: Object emptyMonitor = new Object();
16:
17: public Object dequeue() {
18: synchronized (emptyMonitor) {
19: while (elements.isEmpty()) {
20: try {
21: emptyMonitor.wait(); // wait for an enqueue.
22: } catch (InterruptedException e) {
23: }
24: }
25: // get from head
26: return elements.remove(0);
27: }
28: }
29:
30: public void enqueue(Object element) {
31: synchronized (emptyMonitor) {
32: // put on tail
33: elements.add(element);
34: emptyMonitor.notifyAll(); // wake up any dequeue-ing thread.
35: }
36: }
37: }
|