@Override
      public void run() {
        Runnable runnable = runnableRef.getAndSet(null);
        if (runnable == null) {
          return;
        }
        try {
          runnable.run();
        }
        catch (Throwable e) {
          exception.set(e);
        }
        finally {
          semaphore.up();
        }
      }
@Override
      public void run()