Можно ли добавить Thread.sleep в цикл! .IsTermination? - PullRequest
2 голосов
/ 06 июня 2019

Типичный пример ExecutorService показывает использование цикла while, в котором простые тесты проходят проверку после запроса на выключение. Я думаю, что цикл while вызывается слишком часто, чтобы ничего не делать.

Можно ли поместить Thread.sleep (x) в цикл, чтобы освободить ресурсы процессора?

es.shutdown();
while (!es.isTerminated()) {
    try {
        Thread.sleep(60000);
    } catch (InterruptedException e) {
        e.printStackTrace();
        return;
    }
}

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Основные ошибки здесь:

  • Вы проверяете только прекращение каждые 60 с. Таким образом, если вы просто пропустите переход с несостоявшегося на прекращенный, вы можете ждать до 60 секунд слишком долго
  • Вы не прерываете текущий поток, когда вас прерывают. Если вас прерывают, вы (почти) всегда хотите сохранить тот факт, что вас прервали, чтобы код, вызвавший этот код, мог знать, что ему нужно остановить то, что он делает. В идеале это делается для того, чтобы позволить InterruptedException распространяться, но в качестве альтернативы путем повторного прерывания потока.

Было бы лучше использовать

es.awaitTermination(60, SECONDS);

для остановки, как только исполнитель завершит работу.

И, когда вы ловите прерывание:

Thread.currentThread().interrupt();

, чтобы позволить ему распространяться.

Или отказаться от петли и просто поспать действительно долго:

es.awaitTermination(Long.MAX_VALUE, SECONDS);
0 голосов
/ 06 июня 2019

В этом конкретном сценарии использование Thread.sleep будет иметь смысл только в том случае, если вам абсолютно необходимо, чтобы служба исполнителя была отключена до выполнения какой-либо дополнительной логики.

Если это не так, то приостановите основнойПоток с режимом сна, пока исполнитель выключается, не имеет особого смысла, Jvm не освободит много ресурсов при выполнении этого Thread.sleep (60000)

...