algo atomic

This commit is contained in:
trochas
2025-11-10 11:28:02 +01:00
parent f62778819d
commit a0545c6fbc
4 changed files with 18 additions and 10 deletions

View File

@@ -4,16 +4,14 @@ import interfaces.AlgoDiffusion;
import interfaces.Capteur; import interfaces.Capteur;
import interfaces.ObserverDeCapteurAsync; import interfaces.ObserverDeCapteurAsync;
import java.time.Clock;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class CapteurImpl implements Capteur { public class CapteurImpl implements Capteur {
private int value; private int value = 0;
private AlgoDiffusion diffusion; private AlgoDiffusion diffusion;
protected List<ObserverDeCapteurAsync> observers=new ArrayList<ObserverDeCapteurAsync>(); protected List<ObserverDeCapteurAsync> observers=new ArrayList<ObserverDeCapteurAsync>();
private Boolean locker = false; private Boolean locker = false;
public int initTime = 0;
@Override @Override
public void attach(ObserverDeCapteurAsync o) { public void attach(ObserverDeCapteurAsync o) {
@@ -27,8 +25,8 @@ public class CapteurImpl implements Capteur {
@Override @Override
public void tick() { public void tick() {
Clock clockTime = Clock.systemDefaultZone(); System.out.println("\t\ttick");
this.value = ((int)clockTime.millis())-initTime; this.value++;
if(!locker){ if(!locker){
diffusion.execute(); diffusion.execute();
} }

View File

@@ -2,6 +2,8 @@ package impl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import interfaces.AlgoDiffusion; import interfaces.AlgoDiffusion;
import interfaces.Capteur; import interfaces.Capteur;
@@ -20,8 +22,19 @@ public class DiffusionAtomique implements AlgoDiffusion {
@Override @Override
public void execute() { public void execute() {
capteur.lock(); capteur.lock();
Future<?>[] l = new Future<?>[capteur.observers.size()];
int i = 0;
for (ObserverDeCapteurAsync canal : capteur.observers) { for (ObserverDeCapteurAsync canal : capteur.observers) {
canal.update(); Future<?> f = canal.update();
l[i] = f;
i++;
}
for (Future<?> f : l) {
try {
f.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
} }
capteur.unlock(); //TODO capteur.unlock(); //TODO
} }

View File

@@ -6,7 +6,7 @@ public class Scheduler {
private final ScheduledExecutorService scheduler; private final ScheduledExecutorService scheduler;
public Scheduler(int nbCanaux) { public Scheduler(int nbCanaux) {
int nThread = 20+2*nbCanaux; int nThread = 2+2*nbCanaux;
scheduler = Executors.newScheduledThreadPool(nThread); scheduler = Executors.newScheduledThreadPool(nThread);
} }

View File

@@ -9,7 +9,6 @@ import impl.CapteurImpl;
import impl.DiffusionAtomique; import impl.DiffusionAtomique;
import impl.Scheduler; import impl.Scheduler;
import interfaces.AlgoDiffusion; import interfaces.AlgoDiffusion;
import java.time.*;
public class main { public class main {
@@ -20,8 +19,6 @@ public class main {
Scheduler scheduler = new Scheduler(NB_CANAUX); Scheduler scheduler = new Scheduler(NB_CANAUX);
CapteurImpl c = new CapteurImpl(); CapteurImpl c = new CapteurImpl();
Clock clockTime = Clock.systemDefaultZone();
c.initTime = ((int)clockTime.millis());
DiffusionAtomique algo = new DiffusionAtomique(); DiffusionAtomique algo = new DiffusionAtomique();
algo.capteur = c; algo.capteur = c;
c.setAlgoDiffusion(algo); c.setAlgoDiffusion(algo);