Нить спать не ждет правильное количество - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь использовать многопоточную систему, где, если я не получаю свой ответ вовремя, я получаю тайм-аут и у меня возникает следующая проблема:

public class proba6 {

    public static void main(String[] args) {
        proba6 p = new proba6();
        for (int i = 0; i < 3; i++) {
            p.cycle();
        }

    }

    public void cycle() {
        try {
            long startTime = System.nanoTime();
            Thread.sleep(1000);
            long endTime =System.nanoTime();
            long estimatedTime = endTime - startTime;
            System.out.println("estimatedTime > limit: " + estimatedTime + ">" + 1000000000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

В результате большую часть времени впервый цикл estimatedTime меньше 1000000000. После этого он работает нормально. Вы знаете причину?

1 Ответ

0 голосов
/ 01 октября 2019

Хорошо, если предположить, что с «меньшим» вы имеете в виду «немного меньше», как estimatedTime = 999999321, то это нормально.

По сути, вы останавливаете свой поток, что означает, что ОС должна отправитьПрерывание, сохранение текущего состояния потока, вызов другого потока, чтобы занять его место, и через секунду система должна снова разбудить ваш поток. Таким образом, он проверит, доступно ли вычислительное время, если нет, он может попытаться прервать другой поток (см. Выше) или даже подождать несколько микросекунд, пока другой поток не остановится. Затем он восстанавливает состояние из ранее остановленного потока и продолжает его выполнение.

Посмотрите описание Документы для Thread.sleep () , они говорят:

(...) Однако эти времена ожидания не гарантируются точными, поскольку они ограничены возможностями, предоставляемыми базовой ОС. Кроме того, период ожидания может быть прерван прерываниями, как мы увидим в следующем разделе. В любом случае, вы не можете предполагать, что вызов сна приостановит поток именно на указанный период времени .

...