code: final <Output> int runAsync(@NonNull final ChronosOperation<Output> operation,
              final boolean broadcastResult) {
          final ChronosOperationResult<Output> result = createEmptyResult(operation, broadcastResult);
          final int id = result.getId();
  
          synchronized (ChronosService.this) {
              RunningOperationStorage.getInstance().operationStarted(id, operation,
                      mExecutorService.submit(new Runnable() {
                          @Override
                          public void run() {
                              silentRun(operation, result);
                              mEventBus.post(result);
                              synchronized (ChronosService.this) {
                                  RunningOperationStorage.getInstance().operationFinished(id);
                              }
                          }
                      }));
          }
          return id;
      }
docs: Runs operation in background.
  
  @param operation       an operation to be executed
  @param <Output>        class of the result, returned by the Operations' {@code run} method
  @param broadcastResult {@code true} if the result should be broadcasted, {@code false}
  otherwise
  @return the unique id of the launch