chronos/src/main/java/com/redmadrobot/chronos/ChronosService.java
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;
    }
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;
    }
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