Threads Java

public class AlternateSuspendResume extends Object implements Runnable {
  private volatile int firstVal;
  private volatile int secondVal;
  private volatile boolean suspended;
  public boolean areValuesEqual() {
    return (firstVal == secondVal);
  }
  public void run() {
    try {
      suspended = false;
      firstVal = 0;
      secondVal = 0;
      workMethod();
    } catch (InterruptedException x) {
      System.out.println("interrupted in workMethod()");
    }
  }
  private void workMethod() throws InterruptedException {
    int val = 1;
    while (true) {
      // blocks if suspended is true
      waitWhileSuspended();
      stepOne(val);
      stepTwo(val);
      val++;
      // blocks if suspended is true
      waitWhileSuspended();
      Thread.sleep(200); // pause before looping again
    }
  }
  private void stepOne(int newVal) throws InterruptedException {
    firstVal = newVal;
    // simulate some other lengthy process
    Thread.sleep(300);
  }
  private void stepTwo(int newVal) {
    secondVal = newVal;
  }
  public void suspendRequest() {
    suspended = true;
  }
  public void resumeRequest() {
    suspended = false;
  }
  private void waitWhileSuspended() throws InterruptedException {
    while (suspended) {
      Thread.sleep(200);
    }
  }
  public static void main(String[] args) {
    AlternateSuspendResume asr = new AlternateSuspendResume();
    Thread t = new Thread(asr);
    t.start();
    try {
      Thread.sleep(1000);
    } catch (InterruptedException x) {
    }
    for (int i = 0; i < 10; i++) {
      asr.suspendRequest();
      try {
        Thread.sleep(350);
      } catch (InterruptedException x) {
      }
      System.out.println("dsr.areValuesEqual()=" + asr.areValuesEqual());
      asr.resumeRequest();
      try {
        Thread.sleep((long) (Math.random() * 2000.0));
      } catch (InterruptedException x) {
      }
    }
    System.exit(0);
  }
}