code: private void handleRunAsync(RunAsync runAsync) {
  		final long timeToRun = runAsync.getTimeNanos();
  		final long delayNanos;
  
  		if (timeToRun == 0 || (delayNanos = timeToRun - System.nanoTime()) <= 0) {
  			// run immediately
  			try {
  				runAsync.getRunnable().run();
  			} catch (Throwable t) {
  				log.error("Caught exception while executing runnable in main thread.", t);
  				ExceptionUtils.rethrowIfFatalErrorOrOOM(t);
  			}
  		}
  		else {
  			// schedule for later. send a new message after the delay, which will then be immediately executed
  			FiniteDuration delay = new FiniteDuration(delayNanos, TimeUnit.NANOSECONDS);
  			RunAsync message = new RunAsync(runAsync.getRunnable(), timeToRun);
  
  			final Object envelopedSelfMessage = envelopeSelfMessage(message);
  
  			getContext().system().scheduler().scheduleOnce(delay, getSelf(), envelopedSelfMessage,
  					getContext().dispatcher(), ActorRef.noSender());
  		}
  	}
docs: Handle asynchronous {@link Runnable}. This method simply executes the given {@link Runnable}
  in the context of the actor thread.
  
  @param runAsync Run async message