code: @Override
  	public boolean reschedule()
  	{
  		if (swappedIn != null && swappedIn.getRunState() == RunState.TIMESTEP)
  		{
  			return false; // Can't schedule anything else and we're idle.
  		}
  
  		if (policy.reschedule())
  		{
  			ISchedulableThread best = policy.getThread();
  
  			if (swappedIn != best)
  			{
  				if (swappedIn != null)
  				{
  					RTLogger.log(new RTThreadSwapMessage(SwapType.Out, swappedIn, this, 0, 0));
  				}
  
  				long delay = SystemClock.getWallTime() - best.getSwapInBy();
  
  				if (best.getSwapInBy() > 0 && delay > 0)
  				{
  					RTLogger.log(new RTThreadSwapMessage(SwapType.DelayedIn, best, this, 0, delay));
  				} else
  				{
  					RTLogger.log(new RTThreadSwapMessage(SwapType.In, best, this, 0, 0));
  				}
  			}
  
  			swappedIn = best;
  			swappedIn.runslice(policy.getTimeslice());
  
  			switch (swappedIn.getRunState())
  			{
  				case COMPLETE:
  					RTLogger.log(new RTThreadSwapMessage(SwapType.Out, swappedIn, this, 0, 0));
  
  					RTLogger.log(new RTThreadKillMessage(swappedIn, this));
  
  					swappedIn = null;
  					return true; // We may be able to run other threads
  
  				case TIMESTEP:
  					return false; // We're definitely idle
  
  				default:
  					return true; // We may be able to run other threads
  			}
  		} else
  		{
  			return false;
  		}
  	}
docs: may be due to a time step, including a swap delay).