code: public final void schedule (long initialDelay, long repeatDelay, boolean fixedRate)
      {
          cancel();
          IntervalTask task = new IntervalTask(this);
          _task = task;
  
          // try twice to schedule the task- see comment inside the catch
          try {
              scheduleTask(initialDelay, repeatDelay, fixedRate);
  
          } catch (IllegalStateException ise) {
              // Timer.schedule will only throw this if the TimerThead was shut down.
              // This may happen automatically in Applets, so we need to create a new
              // Timer now. Note that in a multithreaded environment it may be possible
              // to have more than one Timer after this happens. That would be slightly
              // undesirable but should not break anything.
              _timer = createTimer();
              scheduleTask(initialDelay, repeatDelay, fixedRate);
          }
      }
docs: Schedule the interval to execute repeatedly with the specified initial delay and repeat
  delay. Supersedes any previous schedule that this Interval may have had.
  
  <p> Note: if a repeating interval is scheduled to post itself to a RunQueue and the target
  RunQueue is shutdown when the interval expires, the interval will cancel itself and log a
  warning message. </p>
  
  @param fixedRate - if true, this interval schedules repeated expirations using
  {@link Timer#scheduleAtFixedRate(TimerTask, long, long)} ensuring that the number of
  expired calls will match the amount of time elapsed. If false, it uses
  {@link Timer#schedule(TimerTask, long, long)} which ensures that there will be close to
  <code>repeateDelay</code> milliseconds between expirations.
  
  @exception IllegalArgumentException if fixedRate is false and a RunQueue has been specified.
  That doesn't make sense because the fixed delay cannot account for the time that the
  RunBuddy sits on the RunQueue waiting to call expire().