@Override
public final InputDatum<T> dequeue(long timeout,
TimeUnit timeoutUnit) throws IOException, InterruptedException {
Stopwatch stopwatch = new Stopwatch();
stopwatch.start();
long sleepNano = computeSleepNano(timeout, timeoutUnit);
long timeoutNano = timeoutUnit.toNanos(timeout);
InputDatum<T> result = tryDequeue(timeout, timeoutUnit);
while (!result.needProcess()) {