diff --git a/src/Customer.java b/src/Customer.java index 7796cfc..fa3f9c2 100644 --- a/src/Customer.java +++ b/src/Customer.java @@ -2,12 +2,13 @@ public class Customer implements Runnable { private final PastryShop shop; public Customer(PastryShop shop) { + System.out.println("I'm hungry"); this.shop = shop; } @Override public void run() { - //TODO + System.out.println("customer running..."); shop.get(); } } diff --git a/src/Main.java b/src/Main.java index 06df8af..614ad25 100644 --- a/src/Main.java +++ b/src/Main.java @@ -4,9 +4,13 @@ public class Main { Thread producer1 = new Thread(new PastryChef(shop)); Thread consumer1 = new Thread(new Customer(shop)); - /* + Thread consumer2 = new Thread(new Customer(shop)); + Thread consumer3 = new Thread(new Customer(shop)); + producer1.start(); consumer1.start(); - */ + consumer2.start(); + consumer3.start(); + } } diff --git a/src/PastryChef.java b/src/PastryChef.java index b8b2251..8ae3808 100644 --- a/src/PastryChef.java +++ b/src/PastryChef.java @@ -2,12 +2,13 @@ public class PastryChef implements Runnable { private final PastryShop shop; public PastryChef(PastryShop shop) { + System.out.println("I'm a chef"); this.shop = shop; } @Override public void run() { - //TODO + System.out.println("chef running..."); shop.put(new Pastry()); } } diff --git a/src/PastryShop.java b/src/PastryShop.java index a1084d0..a297dc9 100644 --- a/src/PastryShop.java +++ b/src/PastryShop.java @@ -1,23 +1,53 @@ import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; -public class PastryShop { - private final List stock = new ArrayList<>(); +public class PastryShop extends ArrayList { + private static final int MAX_STOCK_SIZE = 20; - int head = 0, tail = 0; // probably wrong + public synchronized void put(Pastry pastry) { + while (getStock() == MAX_STOCK_SIZE) { + try { + System.out.println(getStock() + " pastries, producer blocked"); + this.wait(); + } catch (InterruptedException ex) { + // TODO what else can we do here? + System.err.println(Arrays.toString(ex.getStackTrace())); + } + } + while (getStock() < MAX_STOCK_SIZE) { + this.add(pastry); + System.out.println("A Pastry was put in the shop -- " + getStock() + " remaining"); - public boolean put(Pastry pastry) { - //TODO - stock.add(tail, pastry); - return true; + this.notify(); + } } - public Pastry get() { - //TODO - return stock.get(head); + public synchronized Pastry get() { + while (getStock() == 0) { + try { + System.out.println(getStock() + " pastries, consumer blocked"); + this.wait(); + } catch (InterruptedException ex) { + // TODO what else can we do here? + System.err.println(Arrays.toString(ex.getStackTrace())); + } + + } + + Pastry res = this.get(0); + this.remove(res); + System.out.println("A Pastry was got from the shop -- " + getStock() + " remaining"); + + this.notify(); + + return res; } public int getStock() { - return stock.size(); + return this.size(); + } + + public synchronized void prime() { + this.notify(); } }