X-Git-Url: https://git.piment-noir.org/?p=TD_SR.git;a=blobdiff_plain;f=TD1%2Fexo3%2FBufferCirc.java;h=3c7a65efc1d554ee7c1415a4414916610d11b293;hp=71204cc158c1680631d02c0714d338e90f9785a1;hb=ce28a0211974450cf5df46e2065fb39350e029ec;hpb=396bc7433aa7fc3c404f2d175d1c93b82791cdde diff --git a/TD1/exo3/BufferCirc.java b/TD1/exo3/BufferCirc.java index 71204cc..3c7a65e 100644 --- a/TD1/exo3/BufferCirc.java +++ b/TD1/exo3/BufferCirc.java @@ -1,57 +1,71 @@ - - -/** - * 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) { - if (!isFull()) { - nbObj++; - tampon[prem] = obj; - prem = (prem + 1) % taille; - System.out.println(Thread.currentThread().getName() + " a depose " + (Integer)obj); - } else { - System.out.println("Buffer plein pour " + Thread.currentThread().getName()); - } - } - - - public synchronized Object preleve() { - Object outObj = null; - if (isEmpty()) { - nbObj--; - outObj = tampon[der]; - der = (der + 1) % taille; - System.out.println(Thread.currentThread().getName() + " a preleve " + (Integer)outObj); - } else { - System.out.println("Buffer vide pour " + Thread.currentThread().getName()); - } - return outObj; - } - -} // fin class BufferCirc + + +/** + * 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