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