예제 #1
0
파일: Boat.java 프로젝트: bhaviksingh/CS162
  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();
        }
      }
    }
  }
예제 #2
0
파일: Condition.java 프로젝트: ryanym/CS162
  /**
   * Wake up all threads sleeping on this condition variable. The current thread must hold the
   * associated lock.
   */
  public void wakeAll() {
    Lib.assertTrue(conditionLock.isHeldByCurrentThread());

    while (!waitQueue.isEmpty()) wake();
  }