diff --git a/.idea/encodings.xml b/.idea/encodings.xml index ad0f614..ab83987 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,9 +1,10 @@ + + - + - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml new file mode 100644 index 0000000..f854ab0 --- /dev/null +++ b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml new file mode 100644 index 0000000..be380a5 --- /dev/null +++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml new file mode 100644 index 0000000..8e5d3f2 --- /dev/null +++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml new file mode 100644 index 0000000..fbc1b16 --- /dev/null +++ b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 70a0c84..e65e1c3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -9,7 +9,7 @@ - + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecteursredacteurs/lecteursredacteurs.iml b/lecteursredacteurs/lecteursredacteurs.iml index 08c1eba..3dd51ff 100644 --- a/lecteursredacteurs/lecteursredacteurs.iml +++ b/lecteursredacteurs/lecteursredacteurs.iml @@ -11,5 +11,9 @@ + + + + \ No newline at end of file diff --git a/lecteursredacteurs/pom.xml b/lecteursredacteurs/pom.xml index 0126124..bbefc3d 100644 --- a/lecteursredacteurs/pom.xml +++ b/lecteursredacteurs/pom.xml @@ -7,6 +7,14 @@ ch.heigvd.to lecteursredacteurs 1.0-SNAPSHOT + + + org.junit.jupiter + junit-jupiter-api + 5.6.0 + compile + + pom diff --git a/lecteursredacteurs/src/main/java/Controleur.java b/lecteursredacteurs/src/main/java/Controleur.java new file mode 100644 index 0000000..36abbb2 --- /dev/null +++ b/lecteursredacteurs/src/main/java/Controleur.java @@ -0,0 +1,55 @@ +public class Controleur { + + private int redacteurs = 0; + private int redacteursAttente = 0; + private int lecteurs = 0; // Nombre de lecteurs en train de lire + + public synchronized void startRead() { + + // Si il y a un rédacteur en train d'écrire -> thread en attente + while (redacteurs > 0 || redacteursAttente > 0) { + try { + this.wait(); + } catch (InterruptedException e) { + } + } + lecteurs++;// Un lecteur supplémentaire + } + + public synchronized void stopRead() { + /* + un lecteur actif en moins, si il n'y en + a plus, on libère tout les threads en wait avec notifyAll + */ + lecteurs--; + if (lecteurs == 0) this.notifyAll(); + + } + + public synchronized void startWrite() { + redacteursAttente++; + /* Si il y a encore un lecteur en train de lire + ou un autre redacteur en train d'écrire + le thread est en attente. + */ + while ((lecteurs > 0 || redacteurs > 0)) { + try { + this.wait(); + } catch (InterruptedException e) { + } + } + redacteurs++; + redacteursAttente--; + } + + public synchronized void stopWrite() { + /* + un lecteur actif en moins, si il n'y en + a plus, on libère tout les threads en wait avec notifyAll + */ + redacteurs--; + if (lecteurs == 0) this.notifyAll(); + } +} + + diff --git a/lecteursredacteurs/src/main/java/Lecteur.java b/lecteursredacteurs/src/main/java/Lecteur.java new file mode 100644 index 0000000..a3460f0 --- /dev/null +++ b/lecteursredacteurs/src/main/java/Lecteur.java @@ -0,0 +1,43 @@ +/* +porblème avec l'utilisation de thread sleep car les assert ne marche pas à tout les coup. + */ + +public class Lecteur implements Runnable { + + private Controleur controleur; + private boolean enAttente = false; + + public Lecteur(Controleur c) { + controleur = c; + } + + public void run(){ + // si le controleur n'a pas commencé, le lecteur est en attente + enAttente = true; + { + controleur.startRead(); + } + // si il est en train de lire il n'est plus en attente + enAttente = false; + } + + public synchronized void startRead() { + new Thread(this).start(); + try { + Thread.sleep(1); + } catch (InterruptedException e) {} + } + + public synchronized void stopRead() { + controleur.stopRead(); + try { + Thread.sleep(1); + } catch (InterruptedException e) {} + } + + public boolean isWaiting() { + return enAttente; + } + + +} \ No newline at end of file diff --git a/lecteursredacteurs/src/main/java/LecteursRedacteursTest.java b/lecteursredacteurs/src/main/java/LecteursRedacteursTest.java index 4dcdd03..eea4ee9 100644 --- a/lecteursredacteurs/src/main/java/LecteursRedacteursTest.java +++ b/lecteursredacteurs/src/main/java/LecteursRedacteursTest.java @@ -1,6 +1,3 @@ -package ch.heig.pl.lecteursredacteurs; - - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -51,6 +48,7 @@ public void lecteursRedacteurs() throws InterruptedException { redacteur2.startWrite(); redacteur1.stopWrite(); + // redacteur 1 libère mais redacteur 2 passe avant lecteur 3 assertTrue(lecteur3.isWaiting()); assertFalse(redacteur2.isWaiting()); @@ -59,6 +57,9 @@ public void lecteursRedacteurs() throws InterruptedException { // après les redacteurs , lecteur3 est libéré assertFalse(lecteur3.isWaiting()); lecteur3.stopRead(); + + + } } \ No newline at end of file diff --git a/lecteursredacteurs/src/main/java/Redacteur.java b/lecteursredacteurs/src/main/java/Redacteur.java new file mode 100644 index 0000000..fd63460 --- /dev/null +++ b/lecteursredacteurs/src/main/java/Redacteur.java @@ -0,0 +1,38 @@ +public class Redacteur implements Runnable{ + + private Controleur controleur; + private boolean enAttente = false; + + public Redacteur(Controleur c) { + controleur = c; + } + + public void run() { + // si le controleur n'a pas commencé, le redacteur est en attente + enAttente = true; + { + controleur.startWrite(); + } + // si il est en train d'écrire il n'est plus en attente + enAttente = false; + } + + public synchronized void startWrite() { + new Thread(this).start(); + try { + Thread.sleep(1); + } catch (InterruptedException e) {} + } + + public synchronized void stopWrite() { + controleur.stopWrite(); + try { + Thread.sleep(1); + } catch (InterruptedException e) {} + } + + public boolean isWaiting() { + return enAttente; + } + +} diff --git a/lecteursredacteurs/target/classes/Controleur.class b/lecteursredacteurs/target/classes/Controleur.class new file mode 100644 index 0000000..45250d9 Binary files /dev/null and b/lecteursredacteurs/target/classes/Controleur.class differ diff --git a/lecteursredacteurs/target/classes/Lecteur.class b/lecteursredacteurs/target/classes/Lecteur.class new file mode 100644 index 0000000..c2b676c Binary files /dev/null and b/lecteursredacteurs/target/classes/Lecteur.class differ diff --git a/lecteursredacteurs/target/classes/LecteursRedacteursTest.class b/lecteursredacteurs/target/classes/LecteursRedacteursTest.class new file mode 100644 index 0000000..1d5065b Binary files /dev/null and b/lecteursredacteurs/target/classes/LecteursRedacteursTest.class differ diff --git a/lecteursredacteurs/target/classes/META-INF/lecteursredacteurs.kotlin_module b/lecteursredacteurs/target/classes/META-INF/lecteursredacteurs.kotlin_module new file mode 100644 index 0000000..2983af7 Binary files /dev/null and b/lecteursredacteurs/target/classes/META-INF/lecteursredacteurs.kotlin_module differ diff --git a/lecteursredacteurs/target/classes/Redacteur.class b/lecteursredacteurs/target/classes/Redacteur.class new file mode 100644 index 0000000..b6a4cc6 Binary files /dev/null and b/lecteursredacteurs/target/classes/Redacteur.class differ