@Override
        public boolean cancel() {
            // only update the state it will be removed from HashedWheelBucket on next tick.
            if (!compareAndSetState(ST_INIT, ST_CANCELLED)) {
                return false;
            }
            // If a task should be canceled we put this to another queue which will be processed on each tick.
            // So this means that we will have a GC latency of max. 1 tick duration which is good enough. This way
            // we can make again use of our MpscLinkedQueue and so minimize the locking / overhead as much as possible.
            timer.cancelledTimeouts.add(this);
            return true;
        }
Calculate goal nanoTime from startTime and current tick number,
then wait until that goal has been reached.

@return Long.MIN_VALUE if received a shutdown request,
current time otherwise (with Long.MIN_VALUE changed by +1)
jraft-core/src/main/java/com/alipay/sofa/jraft/util/timer/HashedWheelTimer.java