code: public synchronized void shouldStopAndJoin(final long timeOut) throws InterruptedException {
          if (!isStarted()) {
              throw new IllegalStateException("Not started yet");
          }
  
          Ln.d("SpiceManager stopping. Joining");
          this.isStopped = true;
          dontNotifyAnyRequestListenersInternal();
          if (requestQueue.isEmpty()) {
              this.runner.interrupt();
          }
          long start = System.currentTimeMillis();
          try {
              this.runner.join(timeOut);
          } catch (InterruptedException e) {
              throw e;
          } finally {
              long end = System.currentTimeMillis();
              Ln.d("Runner join time (ms) when should stop %d", end - start);
          }
          unbindFromService();
          this.runner = null;
          this.executorService.shutdown();
          this.contextWeakReference.clear();
          Ln.d("SpiceManager stopped.");
      }
docs: This is mostly a testing method. Stops the {@link SpiceManager}. It will
  unbind from {@link SpiceService}. All request listeners that had been
  registered to listen to {@link SpiceRequest}s sent from this
  {@link SpiceManager} will be unregistered. None of them will be notified
  with the results of their {@link SpiceRequest}s. Unbinding will occur
  syncrhonously : the method returns when all events have been unregistered
  and when main processing thread stops.