diff --git a/src/impl/CapteurImpl.java b/src/impl/CapteurImpl.java index 782d693..7a80562 100644 --- a/src/impl/CapteurImpl.java +++ b/src/impl/CapteurImpl.java @@ -10,7 +10,6 @@ import java.util.concurrent.ScheduledExecutorService; public class CapteurImpl implements Capteur { - private ScheduledExecutorService scheduler; private int value = 0; private AlgoDiffusion diffusion; protected List observers=new ArrayList(); @@ -30,16 +29,14 @@ public class CapteurImpl implements Capteur { } @Override - public void tick() { - System.out.println("tick call"); + public void tick() { if(!locker){ this.value++; - System.out.println("tick(" + this.value+")\t\t" + (System.currentTimeMillis()-initialTime) + "ms"); - //diffusion.execute(); - if(!locker2){ - scheduler.execute(() -> diffusion.execute()); - } } + System.out.println("tick(" + this.value+")\t\t" + (System.currentTimeMillis()-initialTime) + "ms" + " locker : " + locker); + diffusion.execute(); + + } public synchronized void lock(){ @@ -67,10 +64,10 @@ public class CapteurImpl implements Capteur { return this.value; } - public void setScheduler(ScheduledExecutorService scheduler){ - this.scheduler = scheduler; + @Override + public int getValueDiffusion(){ + return this.diffusion.getValue(); } - } diff --git a/src/impl/DiffusionSequencielle.java b/src/impl/DiffusionSequencielle.java index c67daeb..123ea35 100644 --- a/src/impl/DiffusionSequencielle.java +++ b/src/impl/DiffusionSequencielle.java @@ -9,6 +9,9 @@ import interfaces.ObserverDeCapteurAsync; public class DiffusionSequencielle implements AlgoDiffusion { public CapteurImpl capteur; + private Future[] futures; + private int value; + private boolean valueSave = false; @Override public void configure() { @@ -16,41 +19,37 @@ public class DiffusionSequencielle implements AlgoDiffusion { throw new UnsupportedOperationException("Unimplemented method 'configure'"); } + @Override + public int getValue(){ + if(!valueSave){ + this.value=this.capteur.getValue(); + this.valueSave = true; + } + return this.value; + } + @Override public void execute() { - this.capteur.lock2(); - System.out.println("execute"); - Future[] l = new Future[capteur.observers.size()]; - int i = 0; - for (ObserverDeCapteurAsync canal : capteur.observers) { - Future f = canal.update(); - l[i] = f; - i++; - } - boolean firstDone = false; - while(!firstDone){ //attend que le premier futur soit résolu - for (Future f : l) { - if(f.isDone()){ - this.capteur.lock(); //lock le capteur pour que les autres puissent lire la même valeur que le premier - firstDone = true; - } - } - try { - Thread.sleep(10); - } catch (InterruptedException e) { - e.printStackTrace(); + if(futures == null){ + System.out.println("execute"); + this.futures = new Future[capteur.observers.size()]; + int i = 0; + for (ObserverDeCapteurAsync canal : capteur.observers) { + Future f = canal.update(); + this.futures[i] = f; + i++; } } - - for (Future f : l) { //attend que les autres soient résolus - try { - f.get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); + else{ + boolean allDone = true; + for (Future f : futures) { + allDone = allDone && f.isDone(); + } + if(allDone){ + this.futures = null; + valueSave = false; } } - this.capteur.unlock2(); - this.capteur.unlock(); } } diff --git a/src/impl/GetValueReq.java b/src/impl/GetValueReq.java index 6ed1721..2eee629 100644 --- a/src/impl/GetValueReq.java +++ b/src/impl/GetValueReq.java @@ -12,6 +12,6 @@ public class GetValueReq implements Callable { //AO2 - concrete MI public Integer call() { - return capteur.getValue(); + return capteur.getValueDiffusion(); } } \ No newline at end of file diff --git a/src/interfaces/AlgoDiffusion.java b/src/interfaces/AlgoDiffusion.java index df65009..f190b37 100644 --- a/src/interfaces/AlgoDiffusion.java +++ b/src/interfaces/AlgoDiffusion.java @@ -5,4 +5,6 @@ public interface AlgoDiffusion { public void configure(); public void execute(); + + public int getValue(); } diff --git a/src/interfaces/Capteur.java b/src/interfaces/Capteur.java index 12b6ea5..c8254cf 100644 --- a/src/interfaces/Capteur.java +++ b/src/interfaces/Capteur.java @@ -5,4 +5,5 @@ public interface Capteur { //AO2 - servant public int getValue(); + public int getValueDiffusion(); } diff --git a/src/main.java b/src/main.java index 6b6104f..d4d781d 100644 --- a/src/main.java +++ b/src/main.java @@ -17,7 +17,6 @@ public class main { public static void main(String[] argv){ Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - c.setScheduler(scheduler.getScheculer()); DiffusionAtomique algoAtom = new DiffusionAtomique(); algoAtom.capteur = c; diff --git a/src/test/TestAlgoDiffusionAtom.java b/src/test/TestAlgoDiffusionAtom.java index 9aaf395..2b1effb 100644 --- a/src/test/TestAlgoDiffusionAtom.java +++ b/src/test/TestAlgoDiffusionAtom.java @@ -36,7 +36,6 @@ public class TestAlgoDiffusionAtom { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - c.setScheduler(scheduler.getScheculer()); DiffusionAtomique algo = new DiffusionAtomique(); algo.capteur = c; diff --git a/src/test/TestAlgoDiffusionEpoq.java b/src/test/TestAlgoDiffusionEpoq.java index 8d46783..b94df0f 100644 --- a/src/test/TestAlgoDiffusionEpoq.java +++ b/src/test/TestAlgoDiffusionEpoq.java @@ -36,7 +36,6 @@ public class TestAlgoDiffusionEpoq { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - c.setScheduler(scheduler.getScheculer()); DiffusionEpoque algo = new DiffusionEpoque(); algo.capteur = c; diff --git a/src/test/TestAlgoDiffusionSeq.java b/src/test/TestAlgoDiffusionSeq.java index 17e3f95..93098f4 100644 --- a/src/test/TestAlgoDiffusionSeq.java +++ b/src/test/TestAlgoDiffusionSeq.java @@ -15,7 +15,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import impl.Afficheur; import impl.Canal; import impl.CapteurImpl; -import impl.DiffusionAtomique; import impl.DiffusionSequencielle; import impl.Scheduler; @@ -37,7 +36,6 @@ public class TestAlgoDiffusionSeq { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - c.setScheduler(scheduler.getScheculer()); DiffusionSequencielle algo = new DiffusionSequencielle(); algo.capteur = c;