/** Test if this module is working. */ public static void selfTest() { System.out.print("Enter Condition2.selfTest\n"); Lock lock = new Lock(); Condition2 condition = new Condition2(lock); KThread t[] = new KThread[10]; for (int i = 0; i < 10; i++) { t[i] = new KThread(new Condition2Test(lock, condition)); t[i].setName("Thread" + i).fork(); } KThread.yield(); lock.acquire(); System.out.print("condition.wake();\n"); condition.wake(); System.out.print("condition.wakeAll();\n"); condition.wakeAll(); lock.release(); System.out.print("Leave Condition2.selfTest\n"); t[9].join(); }
static void AdultItinerary() { System.out.println("--- called adult itinerary"); /* This is where you should put your solutions. Make calls to the BoatGrader to show that it is synchronized. For example: bg.AdultRowToMolokai(); indicates that an adult has rowed the boat across to Molokai */ pilotLock.acquire(); // While the boat is not at Oahu or there are more than 2 children on Oahu, // put the adult on Oahu thread to sleep (because we wouldn't send and adult in // these scenarios). while (boatLocation != 0 || numChildrenOnOahu >= 2) { System.out.println("--- can't send an adult to Molokai right now"); adultReadyAtOahu.sleep(); } System.out.println("--- sending an adult to Molokai"); numAdultsOnOahu--; // an adult is rowing Oahu --> Molokai, so decrement bg.AdultRowToMolokai(); numAdultsOnMolokai++; // adult has rowed over, so increment printState(); boatLocation = 1; // boat is now at Molokai childReadyAtMolokai.wake(); // wake up child at Molokai since it's now their turn pilotLock.release(); }
static void ChildItinerary() { System.out.println("--- called child itinerary"); pilotLock.acquire(); Boolean readyToTerminate = false; int currentLocation = 0; // current location set to Oahu while (!isDone) { if (currentLocation == 0) { // If we are currently on Oahu... while (boatLocation != 0 || numChildrenOnOahu == 1) { System.out.println( "--- child currently on Oahu, but the boat is not on Oahu (" + boatLocation + ") or we only have 1 child on Oahu (" + numChildrenOnOahu + ")"); // ...but the boat is not in Oahu or we only have 1 child on Oahu, then sleep. childReadyAtOahu.sleep(); } System.out.println("--- child currently on Oahu, ready to go"); if (numAdultsOnOahu == 0 && numChildrenOnOahu == 2) { // ... we are ready to end the game! System.out.println("--- ready to end the game"); readyToTerminate = true; } if (!hasChildPilot) { hasChildPilot = true; bg.ChildRowToMolokai(); printState(); currentLocation = 1; // this child are now now on Molokai } else { numChildrenOnOahu -= 2; // 2 kids will go Oahu --> Molokai, so decrement bg.ChildRideToMolokai(); numChildrenOnMolokai += 2; // 2 kids have arrived on Molokai, so increment printState(); currentLocation = 1; // this child are now now on Molokai boatLocation = 1; // boat is now at Molokai hasChildPilot = false; if (readyToTerminate) { gameEnd.acquire(); end.wake(); gameEnd.release(); childReadyAtMolokai.sleep(); } else { System.out.println("--- child ready on Molokai"); childReadyAtMolokai.wake(); } } } else { // Else, if we are currently on Molokai... while (boatLocation != 1 || hasChildPilot) { System.out.println( "--- child currently on Molokai, but either the boat is not on Molokai or there's already a child pilot"); // ...but the boat is not at Molokai, then sleep. childReadyAtMolokai.sleep(); } // ...then send a child back to Oahu. hasChildPilot = true; System.out.println("--- child currently on Molokai, send one back to Oahu"); numChildrenOnMolokai--; // child is going from Molokai --> Oahu, so decrement bg.ChildRowToOahu(); numChildrenOnOahu++; // child arrived at Oahu, so incrememt printState(); boatLocation = 0; // boat is now at Oahu currentLocation = 0; // child is now at Oahu hasChildPilot = false; if (numChildrenOnOahu >= 2) { System.out.println("--- we now have 2 children on Oahu"); childReadyAtOahu.wake(); // let Oahu now we're ready to go } else { System.out.println("--- we don't enough children on Oahu so send an adult"); adultReadyAtOahu.wake(); childReadyAtOahu.sleep(); } } } }