From de6f32bf1f43155e40ba0d5ee94cd71bf5595353 Mon Sep 17 00:00:00 2001 From: trochas Date: Wed, 3 Dec 2025 16:38:24 +0100 Subject: [PATCH] =?UTF-8?q?clean,=20constructeur,=20optimisation=20pour=20?= =?UTF-8?q?ne=20pas=20attendre=20un=20tick=20pour=20recr=C3=A9er=20les=20f?= =?UTF-8?q?utures=20suivant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/impl/DiffusionAtomique.java | 49 +++++++++++++++-------------- src/impl/DiffusionEpoque.java | 6 ++-- src/impl/DiffusionSequencielle.java | 34 +++++++------------- src/impl/Scheduler.java | 2 +- src/interfaces/AlgoDiffusion.java | 2 -- src/main.java | 10 +++--- src/test/TestAlgoDiffusionAtom.java | 21 ++++++++----- src/test/TestAlgoDiffusionEpoq.java | 11 ++++--- src/test/TestAlgoDiffusionSeq.java | 3 +- 9 files changed, 65 insertions(+), 73 deletions(-) diff --git a/src/impl/DiffusionAtomique.java b/src/impl/DiffusionAtomique.java index c7bc03b..08d686d 100644 --- a/src/impl/DiffusionAtomique.java +++ b/src/impl/DiffusionAtomique.java @@ -1,6 +1,8 @@ package impl; +import java.util.ArrayList; import java.util.LinkedList; +import java.util.List; import java.util.Queue; import java.util.concurrent.Future; @@ -10,13 +12,15 @@ import interfaces.ObserverDeCapteurAsync; public class DiffusionAtomique implements AlgoDiffusion { public CapteurImpl capteur; - private Future[] futures; - private Queue values = new LinkedList<>(); + private List> futures; + private Queue values; + + + public DiffusionAtomique(CapteurImpl c){ + this.capteur = c; + this.futures = new ArrayList>(); + this.values = new LinkedList<>(); - @Override - public void configure() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'configure'"); } @Override @@ -32,27 +36,24 @@ public class DiffusionAtomique implements AlgoDiffusion { this.values.offer(this.capteur.getValue()); } - if(this.futures==null){ - if(!this.values.isEmpty()){ //le capteur ne répond pas (car stopé ici) - this.futures = new Future[capteur.observers.size()]; - int i = 0; - for (ObserverDeCapteurAsync canal : capteur.observers) { - Future f = canal.update(); - futures[i] = f; - i++; - } - } - } - else{ - boolean allDone = true; - for (Future f : futures) { - allDone = allDone && f.isDone(); - } - if(allDone){ - this.futures = null; + if(!this.futures.isEmpty()){ + //vérification si les Futures sont finis + this.futures.removeIf(Future::isDone); + if(this.futures.isEmpty()){ this.values.remove(); System.out.println("next value"); } } + + // si futures est empty, alors tous les futures canaux précédents sont finis + // et on peut relancer des futures sans attendre le prochain ticket + if(this.futures.isEmpty()){ + if(!this.values.isEmpty()){ //le capteur ne répond pas (car stopé ici) + for (ObserverDeCapteurAsync canal : capteur.observers) { + Future f = canal.update(); + this.futures.add(f); + } + } + } } } diff --git a/src/impl/DiffusionEpoque.java b/src/impl/DiffusionEpoque.java index ceaba4d..e2c8ed2 100644 --- a/src/impl/DiffusionEpoque.java +++ b/src/impl/DiffusionEpoque.java @@ -1,6 +1,5 @@ package impl; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import interfaces.AlgoDiffusion; @@ -11,11 +10,12 @@ public class DiffusionEpoque implements AlgoDiffusion { public CapteurImpl capteur; private Future[] futures; - @Override - public void configure() { + public DiffusionEpoque(CapteurImpl capteur){ + this.capteur = capteur; this.futures = new Future[capteur.observers.size()]; } + @Override public int getValue() { return this.capteur.getValue(); diff --git a/src/impl/DiffusionSequencielle.java b/src/impl/DiffusionSequencielle.java index 6512e1b..adda1fe 100644 --- a/src/impl/DiffusionSequencielle.java +++ b/src/impl/DiffusionSequencielle.java @@ -1,5 +1,7 @@ package impl; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Future; import interfaces.AlgoDiffusion; @@ -8,47 +10,33 @@ import interfaces.ObserverDeCapteurAsync; public class DiffusionSequencielle implements AlgoDiffusion { public CapteurImpl capteur; - private Future[] futures; + private List> futures; private int value; - private boolean valueSave = false; - @Override - public void configure() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'configure'"); + public DiffusionSequencielle(CapteurImpl capteur){ + this.capteur = capteur; + this.futures = new ArrayList>(); } @Override public int getValue(){ - if(!valueSave){ - this.value=this.capteur.getValue(); - this.valueSave = true; - } return this.value; } @Override public void execute() { - if(this.futures == null){ + if(this.futures.isEmpty()){ + this.value = capteur.getValue(); 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++; + this.futures.add(f); } } else{ - boolean allDone = true; - for (Future f : futures) { - allDone = allDone && f.isDone(); - } - if(allDone){ - this.futures = null; - valueSave = false; - } + futures.removeIf(Future::isDone); + } } } diff --git a/src/impl/Scheduler.java b/src/impl/Scheduler.java index 97f4ecd..a9b6ef0 100644 --- a/src/impl/Scheduler.java +++ b/src/impl/Scheduler.java @@ -6,7 +6,7 @@ public class Scheduler { private final ScheduledExecutorService scheduler; public Scheduler(int nbCanaux) { - int nThread = 20+2*nbCanaux; + int nThread = 2+2*nbCanaux; this.scheduler = Executors.newScheduledThreadPool(nThread); } diff --git a/src/interfaces/AlgoDiffusion.java b/src/interfaces/AlgoDiffusion.java index f190b37..3227ea5 100644 --- a/src/interfaces/AlgoDiffusion.java +++ b/src/interfaces/AlgoDiffusion.java @@ -2,8 +2,6 @@ package interfaces; public interface AlgoDiffusion { - public void configure(); - public void execute(); public int getValue(); diff --git a/src/main.java b/src/main.java index d4d781d..2002d01 100644 --- a/src/main.java +++ b/src/main.java @@ -18,12 +18,10 @@ public class main { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - DiffusionAtomique algoAtom = new DiffusionAtomique(); - algoAtom.capteur = c; - DiffusionSequencielle algoSeq = new DiffusionSequencielle(); - algoSeq.capteur = c; - DiffusionEpoque algoEpoq = new DiffusionEpoque(); - algoEpoq.capteur = c; + DiffusionAtomique algoAtom = new DiffusionAtomique(c); + DiffusionSequencielle algoSeq = new DiffusionSequencielle(c); + DiffusionEpoque algoEpoq = new DiffusionEpoque(c); + //algoEpoq.capteur = c; c.setAlgoDiffusion(algoEpoq); diff --git a/src/test/TestAlgoDiffusionAtom.java b/src/test/TestAlgoDiffusionAtom.java index 0947f99..28dd302 100644 --- a/src/test/TestAlgoDiffusionAtom.java +++ b/src/test/TestAlgoDiffusionAtom.java @@ -21,6 +21,7 @@ import impl.Scheduler; public class TestAlgoDiffusionAtom { static int NB_CANAUX = 3; + static int TEST_TIME = 30; // TEST_TIME/6 + TEST_TIME-TEST_TIME/6 public static List[] rAtom; @@ -37,8 +38,8 @@ public class TestAlgoDiffusionAtom { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - DiffusionAtomique algo = new DiffusionAtomique(); - algo.capteur = c; + DiffusionAtomique algo = new DiffusionAtomique(c); + c.setAlgoDiffusion(algo); for(int i = 0; i future = clock.scheduleAtFixedRate(() -> c.tick(), 0, 500, TimeUnit.MILLISECONDS); - Thread.sleep(10000); - System.out.println("STOP"); - c.stop(); //arrête la mise à jour du capteur (mais stop pas le tick) - System.out.println("waitting for lasts display..."); - for(int i = 60; i>0; i--){ + for(int i = TEST_TIME/6; i>0; i--){ //attend que le capteur génère des valeurs System.out.println("restant " + i + "s"); Thread.sleep(1000); } + + System.out.println("STOP"); + c.stop(); //arrête la mise à jour du capteur (mais stop pas le tick) + System.out.println("waitting for lasts display..."); + + for(int i = TEST_TIME-TEST_TIME/6; i>0; i--){ + System.out.println("restant " + i + "s"); + Thread.sleep(1000); + } + future.cancel(false); clock.shutdown(); diff --git a/src/test/TestAlgoDiffusionEpoq.java b/src/test/TestAlgoDiffusionEpoq.java index fc2b9cb..1666829 100644 --- a/src/test/TestAlgoDiffusionEpoq.java +++ b/src/test/TestAlgoDiffusionEpoq.java @@ -37,10 +37,6 @@ public class TestAlgoDiffusionEpoq { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - DiffusionEpoque algo = new DiffusionEpoque(); - algo.capteur = c; - c.setAlgoDiffusion(algo); - for(int i = 0; i future = clock.scheduleAtFixedRate(() -> c.tick(), 0, 500, TimeUnit.MILLISECONDS); diff --git a/src/test/TestAlgoDiffusionSeq.java b/src/test/TestAlgoDiffusionSeq.java index 93098f4..0a61d61 100644 --- a/src/test/TestAlgoDiffusionSeq.java +++ b/src/test/TestAlgoDiffusionSeq.java @@ -37,8 +37,7 @@ public class TestAlgoDiffusionSeq { Scheduler scheduler = new Scheduler(NB_CANAUX); CapteurImpl c = new CapteurImpl(); - DiffusionSequencielle algo = new DiffusionSequencielle(); - algo.capteur = c; + DiffusionSequencielle algo = new DiffusionSequencielle(c); c.setAlgoDiffusion(algo); for(int i = 0; i