-\r
-\r
-/**\r
- * implementation du producteur consommateur avec un buffer circulaire\r
- */\r
-public class BufferCirc {\r
-\r
- private Object[] tampon;\r
- private int taille;\r
- private int prem, der, nbObj;\r
-\r
-\r
- public BufferCirc (int t) {\r
- taille = t;\r
- tampon = new Object[taille];\r
- prem = 0;\r
- der = 0;\r
- nbObj = 0;\r
- }\r
-\r
-\r
- public boolean isEmpty() {\r
- return nbObj == 0;\r
- }\r
-\r
-\r
- public boolean isFull() {\r
- return nbObj == taille;\r
- }\r
-\r
-\r
- public synchronized void depose(Object obj) {\r
- if (!isFull()) {\r
- nbObj++;\r
- tampon[prem] = obj;\r
- prem = (prem + 1) % taille;\r
- System.out.println(Thread.currentThread().getName() + " a depose " + (Integer)obj);\r
- } else {\r
- System.out.println("Buffer plein pour " + Thread.currentThread().getName());\r
- }\r
- }\r
-\r
-\r
- public synchronized Object preleve() {\r
- Object outObj = null;\r
- if (isEmpty()) {\r
- nbObj--;\r
- outObj = tampon[der];\r
- der = (der + 1) % taille;\r
- System.out.println(Thread.currentThread().getName() + " a preleve " + (Integer)outObj);\r
- } else {\r
- System.out.println("Buffer vide pour " + Thread.currentThread().getName());\r
- }\r
- return outObj;\r
- }\r
-\r
-} // fin class BufferCirc\r
+
+
+/**
+ * implementation du producteur consommateur avec un buffer circulaire
+ */
+public class BufferCirc {
+
+ private Object[] tampon;
+ private int taille;
+ private int prem, der, nbObj;
+
+
+ public BufferCirc (int t) {
+ taille = t;
+ tampon = new Object[taille];
+ prem = 0;
+ der = 0;
+ nbObj = 0;
+ }
+
+
+ public boolean isEmpty() {
+ return nbObj == 0;
+ }
+
+
+ public boolean isFull() {
+ return nbObj == taille;
+ }
+
+
+ public synchronized void depose(Object obj) {
+ while(isFull()) {
+ try {
+ System.out.println("Buffer is full: " + Thread.currentThread().getName()
+ + " is waiting, size: " + nbObj);
+ wait();
+ }
+ catch (InterruptedException e) {
+ System.err.println("InterruptedException: " + e);
+ }
+ }
+ nbObj++;
+ tampon[prem] = obj;
+ prem = (prem + 1) % taille;
+ //System.out.println(Thread.currentThread().getName() + " a depose " + (Integer)obj);
+ notifyAll();
+ }
+
+
+ public synchronized Object preleve() {
+ while(isEmpty()) {
+ try {
+ System.out.println("Buffer is empty: " + Thread.currentThread().getName()
+ + " is waiting, size: " + nbObj);
+ wait();
+ }
+ catch (InterruptedException e) {
+ System.err.println("InterruptedException: " + e);
+ }
+ }
+ Object outObj = null;
+ nbObj--;
+ outObj = tampon[der];
+ der = (der + 1) % taille;
+ //System.out.println(Thread.currentThread().getName() + " a preleve " + (Integer)outObj);
+ notifyAll();
+ return outObj;
+ }
+
+} // fin class BufferCirc