static void SampleItinerary() { // Please note that this isn't a valid solution (you can't fit // all of them on the boat). Please also note that you may not // have a single thread calculate a solution and then just play // it back at the autograder -- you will be caught. System.out.println("\n ***Everyone piles on the boat and goes to Molokai***"); bg.AdultRowToMolokai(); bg.ChildRideToMolokai(); bg.AdultRideToMolokai(); bg.ChildRideToMolokai(); }
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(); } } } }