Netty HashedWheelTimer неожиданное поведение. Тайм-аут срабатывает заранее - PullRequest
1 голос
/ 07 февраля 2011

Давайте рассмотрим ситуацию:

import org.jboss.netty.util.HashedWheelTimer;
import org.jboss.netty.util.Timer;
import org.jboss.netty.util.Timeout;
import org.jboss.netty.util.TimerTask;


Timer timer = new HashedWheelTimer();
Timeout timeout = null;

void establishTimeout() {
    timeout = timer.newTimeout(timerTask, delay, TimeUnit.SECONDS);
}

void cancelTimeout() {
    timeout.cancel()
    timeout = null;
}

public static void main(String[] args) {
    establishTimeout();
    cancelTimeout();
    Thread.sleep(sleepDelay);
    establishTimeout();
}

Что происходит на временной шкале:

0          : establishTimeout(), cancelTimeout()
sleepDelay : establishTimeout()
delay      : timerTask.run()

Почему timerTask работает не на sleepDelay + delay?Как заставить его работать как положено?

1 Ответ

0 голосов
/ 14 февраля 2011

Поскольку delay интерпретируется как секунды, а sleepDelay интерпретируется как миллисекунды.Используйте sleepDelay * 1000, чтобы получить желаемый результат.

public class TaskTester {

    static Timer timer = new HashedWheelTimer();
    static Timeout timeout = null;
    static int delay = 3;
    static int sleepDelay = 2;
    static TimerTask timerTask = new TimerTask(){
        public void run(Timeout timeout) throws Exception {
            System.out.printf("RUN %.3f%n", System.currentTimeMillis() / 1000.0);
        }
    };

    static void establishTimeout() {
        timeout = timer.newTimeout(timerTask, delay, TimeUnit.SECONDS);
    }

    static void cancelTimeout() {
        timeout.cancel();
        timeout = null;
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.printf("START %.3f%n", System.currentTimeMillis() / 1000.0);
        establishTimeout();
        cancelTimeout();
        Thread.sleep(sleepDelay * 1000);
        establishTimeout();
        System.out.printf("MAIN DONE %.3f%n", System.currentTimeMillis() / 1000.0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...