как ждать некоторое время без Thread.sleep ()? - PullRequest
0 голосов
/ 13 декабря 2018

Я использовал GCP Java SDK для запуска / остановки экземпляра.Моя текущая проблема заключается в том, что я хочу подождать некоторое время после запуска или остановки, пока не изменит статус экземпляра на RUNNING или STOPPED.Я хочу сделать это без использования Thread.sleep().

это мой текущий код: -

private void waitDone(Operation operation) throws IOException, 
       InterruptedException {
    String status = operation.getStatus();

    while (!status.equals("DONE")) {
        Thread.sleep(5 * 1000);
        Compute.ZoneOperations.Get get = 
        getCompute().zoneOperations().get(projectId, zone,
                operation.getName());
        operation = get.execute();

        if (operation != null) {
            status = operation.getStatus();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы можете использовать ScheduledExecutorService # scheduleWithFixedDelay.Как то так

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
  Compute.ZoneOperations.Get get = 
  getCompute().zoneOperations().get(projectId, zone, operation.getName());
  operation = get.execute();

  if (operation != null && operation.getStatus().equals("DONE")) {
     executor.shutdown();
  }
}, 0, 5, TimeUnit.SECONDS);
//if you need to block current thread
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
0 голосов
/ 13 декабря 2018

Если вы не хотите блокировать вашу программу во время ожидания изменения статуса (что имеет смысл), поместите ожидание в отдельный поток.

Как создать поток и запустить его, объясняетсяво многих местах, поэтому я не вижу смысла повторять код здесь.Просто выполните поиск.

Как сказал Маниш в комментарии, для решения проблемы неопределенного ожидания вы можете использовать счетчик повторов и выйти из цикла, либо если статус изменится на или , когда вы достигли максимума.количество повторных попыток.

Кроме того, я считаю, что эту версию ожидания немного легче читать:

    TimeUnit.SECONDS.sleep(5);

Она работает так же, как Thread.sleep(5 * 1000);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...