code: @Override
      public T get(long timeout, TimeUnit unit) throws InterruptedException,
              TimeoutException {
          synchronized (lock) {
              if (mIsCancelled) {
                  throw new CancellationException(
                          "The task on GVRFutureOnGlThread has already been cancelled.");
              }
              if (mIsDone) {
                  return t;
              }
              if(unit == null){
                  lock.wait();
              }else{
                  lock.wait(unit.convert(timeout, TimeUnit.MILLISECONDS));
              }
              if (mIsCancelled) {
                  throw new CancellationException(
                          "The task on GVRFutureOnGlThread has already been cancelled.");
              }
              if (!mIsDone) {
                  throw new TimeoutException("Request time out for"
                          + unit.convert(timeout, TimeUnit.MILLISECONDS) + "ms");
              }
              return t;
          }
      }
docs: To get the result we get from run(). With timeout request.
  
  @param timeout
  The timeout number.
  @param unit
  The time unit bound to timeout number.
  @return The result from the Callable we put in.
  
  @throws InterruptedException
  When this thread is interrupted while waiting.
  @throws CancellationException
  When the callable task got successfully cancelled.
  @throws TimeOutException
  When the execution of the callable call() out of timeout
  limitation.