diff --git a/out/production/TP2/Main.class b/out/production/TP2/Main.class index 4e1b9e5..a41415f 100644 Binary files a/out/production/TP2/Main.class and b/out/production/TP2/Main.class differ diff --git a/out/production/TP2/Main3A.class b/out/production/TP2/Main3A.class new file mode 100644 index 0000000..79d8984 Binary files /dev/null and b/out/production/TP2/Main3A.class differ diff --git a/out/production/TP2/sweet/Boulangerie.class b/out/production/TP2/sweet/Boulangerie.class index a552c87..8bb61c9 100644 Binary files a/out/production/TP2/sweet/Boulangerie.class and b/out/production/TP2/sweet/Boulangerie.class differ diff --git a/out/production/TP2/sweet/BoulangerieThreadSafe.class b/out/production/TP2/sweet/BoulangerieThreadSafe.class index 558050e..a278b2e 100644 Binary files a/out/production/TP2/sweet/BoulangerieThreadSafe.class and b/out/production/TP2/sweet/BoulangerieThreadSafe.class differ diff --git a/out/production/TP2/sweet/Client.class b/out/production/TP2/sweet/Client.class index 16ea4c1..773e482 100644 Binary files a/out/production/TP2/sweet/Client.class and b/out/production/TP2/sweet/Client.class differ diff --git a/out/production/TP2/sweet/Gateau.class b/out/production/TP2/sweet/Gateau.class index c834982..ace239f 100644 Binary files a/out/production/TP2/sweet/Gateau.class and b/out/production/TP2/sweet/Gateau.class differ diff --git a/out/production/TP2/sweet/LimitedClient.class b/out/production/TP2/sweet/LimitedClient.class index 1055c60..c59e421 100644 Binary files a/out/production/TP2/sweet/LimitedClient.class and b/out/production/TP2/sweet/LimitedClient.class differ diff --git a/out/production/TP2/sweet/Patissier.class b/out/production/TP2/sweet/Patissier.class index bec6178..87d99df 100644 Binary files a/out/production/TP2/sweet/Patissier.class and b/out/production/TP2/sweet/Patissier.class differ diff --git a/src/Main.java b/src/Main.java index a233f4a..d291e72 100644 --- a/src/Main.java +++ b/src/Main.java @@ -8,7 +8,9 @@ public class Main { ThreadWeaver tw = new ThreadWeaver(); Boulangerie b = new Boulangerie(); Patissier p = new Patissier(b); - tw.addRunners(p, new Client(b)); + Client c1 = new Client(b); + Client c2 = new Client(b); + tw.addRunners(p, c1, c2); tw.weave(); tw.run(); diff --git a/src/Main3A.java b/src/Main3A.java new file mode 100644 index 0000000..6c4cb5d --- /dev/null +++ b/src/Main3A.java @@ -0,0 +1,21 @@ +import sweet.*; +import world.ThreadWeaver; + +public class Main3A { + public static void main(String[] args) { + ThreadWeaver tw = new ThreadWeaver(); + Boulangerie b = new BoulangerieThreadSafe(); + Patissier p = new Patissier(b); + tw.addRunners(p, new LimitedClient(b)); + tw.weave(); + tw.run(); + + try{ + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + p.shouldRun.set(false); + tw.recover(); + } +} \ No newline at end of file diff --git a/src/Main3B.java b/src/Main3B.java new file mode 100644 index 0000000..bb620b3 --- /dev/null +++ b/src/Main3B.java @@ -0,0 +1,21 @@ +import sweet.*; +import world.ThreadWeaver; + +public class Main3B { + public static void main(String[] args) { + ThreadWeaver tw = new ThreadWeaver(); + Boulangerie b = new BoulangerieThreadSafe(); + Patissier p = new Patissier(b); + tw.addRunners(p, new Client(b)); + tw.weave(); + tw.run(); + + try{ + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + p.shouldRun.set(false); + tw.recover(); + } +} \ No newline at end of file diff --git a/src/sweet/Boulangerie.java b/src/sweet/Boulangerie.java index 1c971a1..59160cf 100644 --- a/src/sweet/Boulangerie.java +++ b/src/sweet/Boulangerie.java @@ -7,30 +7,23 @@ import java.util.*; public class Boulangerie { private final ArrayList sweets = new ArrayList<>(); - /** - * - */ - public synchronized void depose(Patisserie p) { + public synchronized boolean depose(Patisserie p) { this.notify(); sweets.add(p); + return true; } - /** - * - */ + public synchronized Patisserie achete() { - while(sweets.size() == 0) { + while(getStock() == 0) { try {this.wait();} catch (InterruptedException ignored) {}} Patisserie pat = sweets.get(0); sweets.remove(pat); return pat; } - /** - * - */ - public void getStock() { - // TODO implement here + public int getStock(){ + return sweets.size(); } } \ No newline at end of file diff --git a/src/sweet/BoulangerieThreadSafe.java b/src/sweet/BoulangerieThreadSafe.java index 414c0bc..5a562d0 100644 --- a/src/sweet/BoulangerieThreadSafe.java +++ b/src/sweet/BoulangerieThreadSafe.java @@ -7,23 +7,25 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; public class BoulangerieThreadSafe extends Boulangerie{ - private final BlockingQueue sweets = new ArrayBlockingQueue(50); + private final BlockingQueue sweets = new ArrayBlockingQueue(10); @Override - public void depose(Patisserie p) { + public boolean depose(Patisserie p) { try{ + if(sweets.remainingCapacity() <= 0) return false; sweets.put(p); - }catch(InterruptedException ignored){} + }catch(InterruptedException ignored){return false;} + return true; } @Override public Patisserie achete() { - try{return sweets.take();} catch (InterruptedException e) {} + try{return sweets.take();} catch (InterruptedException ignored) {} return null; } @Override - public void getStock() { - // TODO implement here + public int getStock() { + return sweets.size(); } } diff --git a/src/sweet/Client.java b/src/sweet/Client.java index 6d0c75e..c297a60 100644 --- a/src/sweet/Client.java +++ b/src/sweet/Client.java @@ -15,8 +15,8 @@ public class Client implements Runnable { @Override public void run() { - while(true) { - local.achete(); + while(local.getStock() < 9999) { + if(local.achete() == Gateau.GATEAU_EMPOISONNE) break; System.out.println("J'ai acheté ma patisserie"); try { Thread.sleep(80); diff --git a/src/sweet/Gateau.java b/src/sweet/Gateau.java index 0b6e045..40013ad 100644 --- a/src/sweet/Gateau.java +++ b/src/sweet/Gateau.java @@ -8,7 +8,7 @@ import java.util.*; * */ public class Gateau extends Patisserie { - + public static final Gateau GATEAU_EMPOISONNE = new Gateau(); /** * Default constructor */ diff --git a/src/sweet/LimitedClient.java b/src/sweet/LimitedClient.java index 72e908c..b43e824 100644 --- a/src/sweet/LimitedClient.java +++ b/src/sweet/LimitedClient.java @@ -1,6 +1,7 @@ package sweet; public class LimitedClient extends Client{ + private int consumed = 0; public LimitedClient(Boulangerie b) { super(b); } @@ -9,6 +10,8 @@ public class LimitedClient extends Client{ public void run() { while(true) { local.achete(); + consumed++; + if(consumed > 10) break; System.out.println("J'ai acheté ma patisserie - Limited"); try { Thread.sleep(80); diff --git a/src/sweet/Patissier.java b/src/sweet/Patissier.java index 8112f73..5a419be 100644 --- a/src/sweet/Patissier.java +++ b/src/sweet/Patissier.java @@ -9,7 +9,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class Patissier implements Runnable { public AtomicBoolean shouldRun = new AtomicBoolean(true); - private final Boulangerie local; + protected final Boulangerie local; /** * Default constructor */ @@ -20,7 +20,9 @@ public class Patissier implements Runnable { @Override public void run() { while(shouldRun.get()) { - local.depose(new Patisserie()); + if(!local.depose(new Patisserie())){ + shouldRun.set(false); + } System.out.println("J'ai produit ma patisserie"); try { Thread.sleep(100); diff --git a/src/sweet/PatissierSuicidal.java b/src/sweet/PatissierSuicidal.java new file mode 100644 index 0000000..120fc23 --- /dev/null +++ b/src/sweet/PatissierSuicidal.java @@ -0,0 +1,31 @@ +package sweet; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * + */ +public class PatissierSuicidal extends Patissier { + public AtomicBoolean shouldRun = new AtomicBoolean(true); + /** + * Default constructor + */ + public PatissierSuicidal(Boulangerie b) { + super(b); + } + + @Override + public void run() { + while(shouldRun.get()) { + if(!local.depose(new Patisserie())){ + shouldRun.set(false); + } + System.out.println("J'ai produit ma patisserie"); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + break; + } + } + } +} \ No newline at end of file