Π’ΠΎΠΎΠ±Ρ‰Π΅ΠΌ Ρ‡ΠΈΡ‚Π°ΡŽ ΠΊΠ½ΠΈΠ³Ρƒ ΠΈ Π² Π½Π΅ΠΉ Π΅ΡΡ‚ΡŒ нСбольшая Π³Π»Π°Π²Π° ΠΏΡ€ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ Π²ΠΎΡ‚ я столкнулся с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ совсСм ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π²ΠΎΡ‚ Π΅Π³ΠΎ ΠΊΠΎΠ΄:
// Try This 12-1

// A simulation of a traffic light that uses
// an enumeration to describe the light's color.

// An enumeration of the colors of a traffic light.
enum TrafficLightColor {
  RED, GREEN, YELLOW
}

// A computerized traffic light.
class TrafficLightSimulator implements Runnable {
  private TrafficLightColor tlc; // holds the current traffic light color
  private boolean stop = false; // set to true to stop the simulation
  private boolean changed = false; // true when the light has changed

  TrafficLightSimulator(TrafficLightColor init) {
    tlc = init;
  }

  TrafficLightSimulator() {
    tlc = TrafficLightColor.RED;
  }

  // Start up the light.
  public void run() {
    while(!stop) {
      try {
        switch(tlc) {
          case GREEN:
            Thread.sleep(10000); // green for 10 seconds
            break;
          case YELLOW:
            Thread.sleep(2000);  // yellow for 2 seconds
            break;
          case RED:
            Thread.sleep(12000); // red for 12 seconds
            break;
        }
      } catch(InterruptedException exc) {
        System.out.println(exc);
      }
      changeColor();
    }
  }

  // Change color.
  synchronized void changeColor() {
    switch(tlc) {
      case RED:
        tlc = TrafficLightColor.GREEN;
        break;
      case YELLOW:
        tlc = TrafficLightColor.RED;
        break;
      case GREEN:
       tlc = TrafficLightColor.YELLOW;
    }

    changed = true;
    notify(); // signal that the light has changed
  }

  // Wait until a light change occurs.
  synchronized void waitForChange() {
    try {
      while(!changed)
        wait(); // wait for light to change
      changed = false;
    } catch(InterruptedException exc) {
      System.out.println(exc);
    }
  }

  // Return current color.
  synchronized TrafficLightColor getColor() {
    return tlc;
  }

  // Stop the traffic light.
  synchronized void cancel() {
    stop = true;
  }
}

class TrafficLightDemo {
  public static void main(String[] args) {
    TrafficLightSimulator tl =
      new TrafficLightSimulator(TrafficLightColor.GREEN);

    Thread thrd = new Thread(tl);
    thrd.start();

    for(int i=0; i < 9; i++) {
      System.out.println(tl.getColor());
      tl.waitForChange();
    }

    tl.cancel();
  }
}
Π’Π°ΠΊ Π²ΠΎΡ‚ Π² Ρ‡Π΅ΠΌ ΡΡƒΡ‚ΡŒ вопроса, Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ synchronized void waitForChange() Π΅ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ» while ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ !changed ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½Π° false Ρ‚Π°ΠΌ ΠΎΠ½Π° с Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ , Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ Π½Π΅ false Ρ‚ΠΎ true ΠΈ Ρ†ΠΈΠΊΠ» запустится ΠΈ приостановит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° main(Ρ‚Π°ΠΊ я сСбС это ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ) ΠΈΠ΄Π΅ΠΌ дальшС Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ thrd Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ synchronized void changeColor() ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² самом ΠΊΠΎΠ½Ρ†Π΅ этой ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ changed присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ notify() ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ main, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π½ΠΎΠ²ΠΎ запустит ΠΌΠ΅Ρ‚ΠΎΠ΄ synchronized void waitForChange() Π½ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ запустится Ρ†ΠΈΠΊΠ» while ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ снова приостановит ΠΏΠΎΡ‚ΠΎΠΊ main Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ changed присвоили true , Π° tru с Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ это false? Π£ΠΆΠ΅ ΠΏΠ°Ρ€Ρƒ Π½ΠΎΡ‡Π΅ΠΉ Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ этот ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚