TD1: Explain and fix the deadlock in exo3.
[TD_SR.git] / TD1 / exo3 / BufferCirc.java
CommitLineData
396bc743
JB
1\r
2\r
3/**\r
4 * implementation du producteur consommateur avec un buffer circulaire\r
5 */\r
6public class BufferCirc {\r
7\r
8 private Object[] tampon;\r
9 private int taille;\r
10 private int prem, der, nbObj;\r
11\r
12\r
13 public BufferCirc (int t) {\r
14 taille = t;\r
15 tampon = new Object[taille];\r
16 prem = 0;\r
17 der = 0;\r
18 nbObj = 0;\r
19 }\r
20\r
21\r
22 public boolean isEmpty() {\r
23 return nbObj == 0;\r
24 }\r
25\r
26\r
27 public boolean isFull() {\r
28 return nbObj == taille;\r
29 }\r
30\r
31\r
32 public synchronized void depose(Object obj) {\r
1180d8d3
JB
33 while(isFull()) {\r
34 try {\r
4b705a7a
JB
35 System.out.println("Buffer is full: " + Thread.currentThread().getName()\r
36 + " is waiting, size: " + nbObj);\r
37\r
1180d8d3
JB
38 wait();\r
39 }\r
40 catch (InterruptedException e) {}\r
396bc743 41 }\r
1180d8d3
JB
42 nbObj++;\r
43 tampon[prem] = obj;\r
44 prem = (prem + 1) % taille;\r
8084e5eb 45 //System.out.println(Thread.currentThread().getName() + " a depose " + (Integer)obj);\r
7bd74736 46 notifyAll();\r
396bc743
JB
47 }\r
48\r
49\r
50 public synchronized Object preleve() {\r
1180d8d3
JB
51 while(isEmpty()) {\r
52 try {\r
4b705a7a
JB
53 System.out.println("Buffer is empty: " + Thread.currentThread().getName()\r
54 + " is waiting, size: " + nbObj);\r
1180d8d3
JB
55 wait();\r
56 }\r
57 catch (InterruptedException e) {}\r
396bc743 58 }\r
1180d8d3
JB
59 Object outObj = null;\r
60 nbObj--;\r
61 outObj = tampon[der];\r
62 der = (der + 1) % taille;\r
8084e5eb 63 //System.out.println(Thread.currentThread().getName() + " a preleve " + (Integer)outObj);\r
7bd74736 64 notifyAll();\r
396bc743
JB
65 return outObj;\r
66 }\r
67\r
68} // fin class BufferCirc\r