code: public <T extends Runnable> T executeAsync(T runnable) {
  		synchronized (this.tasks) {
  			this.tasks.add(runnable);
  			// Notify that a task has been added
  			this.tasks.notifyAll();
  
  			if (this.tasks.size() == 1) {
  				this.onTaskBecameNotEmpty();
  			}
  
  			this.onTaskAdded();
  		}
  		return runnable;
  	}
docs: Add a Task to the queue. It will be run when flushTasks() is called (this is automatically called by
  some direct subclasses like ThreadedSequentialTaskQueue)
  @param the runnable to be executed
  @return the runnable, as a convenience method