没有Thread.sleep()如何等待一段时间?

时间:2018-12-13 09:11:05

标签: java google-cloud-platform

我已将GCP Java SDK用于启动/停止实例。我当前的问题是我要在启动或停止后等待一段时间,直到将实例状态更改为RUNNINGSTOPPED。我想不使用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 :(得分:2)

如果您不想在等待状态变化时阻止程序(这很有意义),请将等待状态放在单独的线程中。

在很多地方都介绍了如何创建线程并启动线程,因此在这里重复代码没有任何意义。只是搜索。

正如Manish在评论中所说,要解决不确定的等待问题,可以使用重试计数器并在状态更改为完成达到最大重试计数时退出循环。

顺便说一句,我认为此版本的等待稍微容易阅读:

    TimeUnit.SECONDS.sleep(5);

它的作用与Thread.sleep(5 * 1000);相同。

答案 1 :(得分:2)

您可以使用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);