1 |
tdb |
1.1 |
Using the Queue class |
2 |
|
|
===================== |
3 |
|
|
|
4 |
|
|
Contents |
5 |
|
|
-------- |
6 |
|
|
- Getting |
7 |
|
|
- Definition of Terms |
8 |
|
|
- Features |
9 |
|
|
- Using |
10 |
|
|
- Points to remember |
11 |
|
|
- Future additions |
12 |
|
|
|
13 |
|
|
tdb1, 02/01/2001 |
14 |
|
|
|
15 |
|
|
|
16 |
|
|
Getting |
17 |
|
|
------- |
18 |
|
|
The Queue class can be found in the i-scream CVS repository, |
19 |
|
|
under experimental/server/Queue. Only the Queue.java and |
20 |
|
|
InvalidQueueException.java files are needed for use, however |
21 |
|
|
the other files provide examples of use. |
22 |
|
|
|
23 |
|
|
|
24 |
|
|
Definition of Terms |
25 |
|
|
------------------- |
26 |
|
|
In this document I will use the following terms to describe |
27 |
|
|
the various actors in the system. |
28 |
|
|
|
29 |
|
|
- Queue |
30 |
|
|
The single instance of the Queue class being used. |
31 |
|
|
|
32 |
|
|
- Producer |
33 |
|
|
Usually the single object generating information, |
34 |
|
|
although there could, in theory, be more than one. |
35 |
|
|
|
36 |
|
|
- Consumer(s) |
37 |
|
|
An object requiring data from the Producer. |
38 |
|
|
|
39 |
|
|
- queue |
40 |
|
|
A queue within the Queue class. |
41 |
|
|
|
42 |
|
|
|
43 |
|
|
Features |
44 |
|
|
-------- |
45 |
|
|
The Queue class provides an extensive range of features, |
46 |
|
|
mostly geared towards the requirements for a queue in the |
47 |
|
|
i-scream server. It is, however, a very general-purpose |
48 |
|
|
design and could be used in any system where the producer |
49 |
|
|
and consumer are seperate threads, and cannot necessarily be |
50 |
|
|
co-ordinated. |
51 |
|
|
|
52 |
|
|
The basic list of features are as follows; |
53 |
|
|
|
54 |
|
|
- Support for a multi-threaded environment |
55 |
|
|
|
56 |
|
|
In a system where the consumer and producer objects are |
57 |
|
|
seperate threads it can be hard to coordinate the adding |
58 |
|
|
and removal of data items to a queue. It may not be |
59 |
|
|
sufficient for the consumer to keep trying until data is |
60 |
|
|
available. |
61 |
|
|
|
62 |
|
|
To solve this the Queue provides a get() method that |
63 |
|
|
will block, if the queue is empty, until data is |
64 |
|
|
available. |
65 |
|
|
|
66 |
|
|
- Support for multiple consumers |
67 |
|
|
|
68 |
|
|
This does away with the need to externally created |
69 |
|
|
multiple instances of the Queue class, which in turn |
70 |
|
|
means only one reference need be passed around. The |
71 |
|
|
Queue class could be considered a singleton, although it |
72 |
|
|
isn't coded as such. |
73 |
|
|
|
74 |
|
|
Internally this is done by holding multiple queues, |
75 |
|
|
which are populated using a single add() method. From |
76 |
|
|
the perspective of the producer this makes life much |
77 |
|
|
easier. Each queue is independant so each consumer can |
78 |
|
|
operate different speeds. |
79 |
|
|
|
80 |
|
|
- Support for dynamic creation/removal of queues |
81 |
|
|
|
82 |
|
|
This allows a consumer to request removal of a queue it |
83 |
|
|
may be using. This helps to keep things tidy if a |
84 |
|
|
consumer needs to be shut down - ie. the internal queue |
85 |
|
|
will no longer be populated, and any remaining data will |
86 |
|
|
be left for garbage collection. |
87 |
|
|
|
88 |
|
|
A queue will be automatically created upon calling the |
89 |
|
|
getQueue() method, which again makes life easier for a |
90 |
|
|
system where consumers may be coming and going. |
91 |
|
|
|
92 |
|
|
|
93 |
|
|
Using |
94 |
|
|
----- |
95 |
|
|
|
96 |
|
|
nb. Each example line is followed by the relevant method |
97 |
|
|
header from the Queue.java file. |
98 |
|
|
|
99 |
|
|
Using the Queue itself is a relatively simple task. Firstly |
100 |
|
|
a Queue object needs to be constructed; |
101 |
|
|
|
102 |
|
|
Queue q = new Queue(); |
103 |
|
|
|
104 |
|
|
public Queue() |
105 |
|
|
|
106 |
|
|
Then, a producer can begin adding data to this queue with no |
107 |
|
|
hassle. This should be looped around as data is added. |
108 |
|
|
|
109 |
|
|
q.add(o); |
110 |
|
|
|
111 |
|
|
public void add(Object o) |
112 |
|
|
|
113 |
|
|
Next, a consumer needs to request a queue. |
114 |
|
|
|
115 |
|
|
n = q.getQueue(); |
116 |
|
|
|
117 |
|
|
public int getQueue() |
118 |
|
|
|
119 |
|
|
Then the consumer can get data items from it's queue. This |
120 |
|
|
can be repeated in a loop, and the method will block if no |
121 |
|
|
data is available. |
122 |
|
|
|
123 |
|
|
Object o = q.get(n); |
124 |
|
|
|
125 |
|
|
public Object get(int queue) throws InvalidQueueException |
126 |
|
|
|
127 |
|
|
When a consumer has finished with the queue it should |
128 |
|
|
request it's removal. |
129 |
|
|
|
130 |
|
|
q.removeQueue(n); |
131 |
|
|
|
132 |
|
|
public void removeQueue(int queue) |
133 |
|
|
|
134 |
|
|
That's all there is to it. For a final touch, there is a |
135 |
|
|
status method that will return the state of each queue, and |
136 |
|
|
provide a counter of how many data items have been added. |
137 |
|
|
It's intended use was as follows; |
138 |
|
|
|
139 |
|
|
System.out.println(q.status()); |
140 |
|
|
|
141 |
|
|
public String status() |
142 |
|
|
|
143 |
|
|
|
144 |
|
|
Points to remember |
145 |
|
|
------------------ |
146 |
|
|
It is very important that the following be remembered. |
147 |
|
|
|
148 |
|
|
- ALWAYS call the removeQueue() method when a consumer no |
149 |
|
|
longer needs to make use of the queue - even for a short |
150 |
|
|
period of time. This avoids a queue filling up with data |
151 |
|
|
(sometimes rather rapidly) when it isn't being drained. |
152 |
|
|
|
153 |
|
|
- A consumer will need to call getQueue() to have a queue |
154 |
|
|
created for itself. It will then need to pass the |
155 |
|
|
returned integer to the get() method every time it |
156 |
|
|
requires data. |
157 |
|
|
|
158 |
|
|
|
159 |
|
|
Future additions |
160 |
|
|
---------------- |
161 |
|
|
The following ideas have been considered, but not yet |
162 |
|
|
implemented. |
163 |
|
|
|
164 |
|
|
- Limiting the size of a queue. This does, however, bring |
165 |
|
|
up problems of what should happen when the queue is |
166 |
|
|
full. |
167 |
|
|
|
168 |
|
|
|
169 |
|
|
About |
170 |
|
|
----- |
171 |
|
|
|
172 |
tdb |
1.2 |
This document was written by Tim Bishop [tdb@i-scream.org] for |
173 |
tdb |
1.1 |
use by the team working on a 3rd year Computer Science |
174 |
|
|
project called "i-scream". More details can be found on the |
175 |
|
|
project website; |
176 |
|
|
|
177 |
tdb |
1.2 |
http://www.i-scream.org |