Communicating Between Threads
Thu Dec 29 2022 19:43:06 GMT+0000 (Coordinated Universal Time)
Saved by @prettyleka
public class CakeMaker { /* Instance Variables */ private boolean whiskInUse = false; private boolean ovenInUse = false; private boolean mixingBowlInUse = false; /* Main Method */ public static void main(String[] args) { CakeMaker c = new CakeMaker(); try { Thread preheatOven = new Thread(c::preheatOven, "preheatOven"); Thread mixDryIngredients = new Thread(c::mixDryIngredients, "mixDryIngredients"); Thread mixWetIngredients = new Thread(c::mixWetIngredients, "mixWetIngredients"); Thread combineIngredients = new Thread(c::combineIngredients, "combineIngredients"); Thread bakeCake = new Thread(c::bakeCake, "bakeCake"); Thread makeFrosting = new Thread(c::makeFrosting, "makeFrosting"); Thread frostCake = new Thread(c::frostCake, "frostCake"); preheatOven.start(); mixDryIngredients.start(); mixWetIngredients.start(); makeFrosting.start(); mixDryIngredients.join(); mixWetIngredients.join(); combineIngredients.start(); combineIngredients.join(); preheatOven.join(); bakeCake.start(); makeFrosting.join(); bakeCake.join(); frostCake.start(); frostCake.join(); System.out.println("Cake complete!"); } catch (Exception e) { System.out.println(e); } } // End of Main /* Instance Methods */ public void preheatOven() { try { printTask("Oven pre-heating..."); ovenInUse = true; Thread.sleep(10000); ovenInUse = false; printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } } public void mixDryIngredients() { try { printTask("Mixing dry ingredients..."); synchronized(this){ while(mixingBowlInUse) { printTask("Waiting for the mixing bowl..."); wait();}// Refactor to synchronize access to mixingBowlInUse printTask("Using mixing bowl!"); mixingBowlInUse = true;} Thread.sleep(200); printTask("Adding cake flour"); Thread.sleep(200); printTask("Adding salt"); Thread.sleep(200); printTask("Adding baking powder"); Thread.sleep(200); printTask("Adding baking soda"); Thread.sleep(200); whiskInUse = true; printTask("Mixing..."); Thread.sleep(200); whiskInUse = false; // Refactor to synchronize access to mixingBowlInUse mixingBowlInUse = false; printTask("Releasing mixing bowl!"); notifyAll(); printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } }; public void mixWetIngredients() { try { printTask("Mixing wet ingredients..."); synchronized(this){ while(mixingBowlInUse) { printTask("Waiting for the mixing bowl..."); wait();}// Refactor to synchronize access to mixingBowlInUse printTask("Using mixing bowl!"); mixingBowlInUse = true;} // Refactor to synchronize access to mixingBowlInUse Thread.sleep(1000); printTask("Adding butter..."); Thread.sleep(500); printTask("Adding eggs..."); Thread.sleep(500); printTask("Adding vanilla extract..."); Thread.sleep(500); printTask("Adding buttermilk..."); Thread.sleep(500); whiskInUse = true; printTask("Mixing..."); Thread.sleep(1500); whiskInUse = false; // Refactor to synchronize access to mixingBowlInUse mixingBowlInUse = false; printTask("Releasing mixing bowl!"); notifyAll(); printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } }; public void combineIngredients() { try { printTask("Combining ingredients..."); mixingBowlInUse = true; Thread.sleep(1000); printTask("Adding dry mix to wet mix..."); Thread.sleep(1500); whiskInUse = true; printTask("Mixing..."); Thread.sleep(1500); whiskInUse = false; mixingBowlInUse = false; printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } }; public void bakeCake() { try { printTask("Baking cake..."); ovenInUse = true; Thread.sleep(10000); ovenInUse = false; printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } } public void makeFrosting() { try { printTask("Making frosting..."); whiskInUse = true; mixingBowlInUse = true; printTask("Adding butter..."); Thread.sleep(200); printTask("Adding milk..."); Thread.sleep(200); printTask("Adding sugar..."); Thread.sleep(200); printTask("Adding vanilla extract..."); Thread.sleep(200); printTask("Adding salt..."); Thread.sleep(200); whiskInUse = false; mixingBowlInUse = false; printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } } public void frostCake() { try { printTask("Frosting cake..."); Thread.sleep(1500); printTask("Done!"); } catch (InterruptedException e) { System.out.println(e); } } private void printTask(String task) { System.out.println(Thread.currentThread().getName() + " " + " - " + task); } }
Comments