Repository navigation
Expand file tree
/
Copy pathBoundedBuffer.java
More file actions
91 lines (72 loc) · 2.33 KB
/
Copy pathBoundedBuffer.java
File metadata and controls
91 lines (72 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.util.concurrent.Semaphore;
class BoundedBuffer implements Buffer{
private static final int BUFFER_SIZE = 3;
private int count;
private int in;
private int out;
private Object[] buffer;
private Semaphore mutex;
private Semaphore empty;
private Semaphore full;
public BoundedBuffer(){
count = 0;
in = 0;
out = 0;
buffer = new Object[BUFFER_SIZE];
mutex = new Semaphore(1);
empty = new Semaphore(BUFFER_SIZE);
full = new Semaphore(0);
}
public void insert(Object item) {
try{
empty.acquire();
mutex.acquire();
}
catch (InterruptedException e) {
System.out.println("ERROR " + e);
}
++count;
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
if (count == BUFFER_SIZE){
System.out.println("BUFFER FULL "
+ "Producer inserted \"" + item
+ "\" count=" + count + ", "
+ "in=" + in + ", out=" + out);
}
else{
System.out.println("Producer inserted \"" + item
+ "\" count=" + count + ", "
+ "in=" + in + ", out=" + out);
}
mutex.release();
full.release();
}
public Object remove() {
Object item=null;
try{
full.acquire();
mutex.acquire();
}
catch (InterruptedException e) {
System.out.println("ERROR in try(): " + e);
}
--count;
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
if (count == 0){
System.out.println("BUFFER EMPTY "
+ "Consumer removed \"" + item
+ "\" count=" + count + ", "
+ "in=" + in + ", out=" + out);
}
else{
System.out.println("Consumer removed \"" + item
+ "\" count=" + count + ", "
+ "in=" + in + ", out=" + out);
}
mutex.release();
empty.release();
return item;
}
}