仅在满足条件时打印 hello world

print hello world only when conditions are met

我只想在以下两个条件都为真时打印出来"Hello World"

否则我会一直睡到以上两个条件都成立。下面是我的代码:

public static void main(String[] args) {
    DateTime dt = new DateTime();
    int hour = dt.getHourOfDay();
    if (hour < 20) {
        TimeUnit.HOURS.sleep(20 - hour);
    }

    boolean isDone = checkStatus();
    while (!isDone) {
        TimeUnit.MINUTES.sleep(15);
        isDone = checkStatus();
    }

    // now print out
    System.out.println("Hello World");
}

如您所见,我分别有两个不同的条件进行检查,最后打印出来。有没有更好的方法来编写上面的代码来完成同样的事情?

它不必完全准确。我每 15 分钟调用一次 checkStatus 方法来查看 isDone 是否变为真。

应用程序中存在错误,如果恰好在上午 8 点之后,但 checkStatus 没有在 return true 午夜之前,那么它将继续在白天执行。

将循环中的两个条件放在一起:

boolean isDone = false;
while (!isDone) {
    int hour = new DateTime().getHourOfDay();
    isDone = hour >= 20;
    if (!isDone) TimeUnit.HOURS.sleep(20 - hour);

    isDone = checkStatus();
    if (!isDone) TimeUnit.MINUTES.sleep(15);
}

System.out.println("Hello World");

也许这种方式对你有帮助。

public boolean CheckHour(){

DateTime dt = new DateTime();
int hour = dt.getHourOfDay();
if (hour < 20) {        
        TimeUnit.HOURS.sleep(20 - hour);            
        return false;       
}
return true;

}


boolean isDone = checkStatus();
while (!isDone || !CheckHour()) {

TimeUnit.MINUTES.sleep(15);
isDone = checkStatus();
}

// now print out
System.out.println("Hello World");

您的代码的要求并不完全清楚,因为您的原始 post 没有指定如果 checkStatus 不 return true 您是否希望代码停止到午夜。我根据您原来的 post 写了以下解决方案,其中指出:

Otherwise I will keep sleeping until both the above conditions become true

我认为上面的引用意味着你希望你的程序一直休眠,除非是晚上 8 点或更晚(当地时间)和 checkStatus 方法 returns true .

在我 post 任何代码之前,我想指出 3 件事:

  1. 您的原始代码,如果在一个小时后调用 - 例如 4:59pm 将休眠 20-(当前时间)直到晚上 8 点或更晚。所以它将从 4:59 休眠到 8:59,因为 20 - 16 = 4。你几乎失去了整整一个小时,你本可以检查你的外部进程的状态。让您的代码一次休眠 1 分钟应该不会对 CPU 使用产生太大影响 - 如果您担心这一点,那么您确实需要获得更快的速度 CPU 或释放一些 CPU - 如果您在接近小时结束时调用您的程序,将防止您浪费太多时间。
  2. 我不知道你为什么要使用 Joda 时间,而你可以很容易地使用 JRE 中包含的 Java API 来完成你想做的事情。在我的代码中,我使用了 Java API,因为我不喜欢无缘无故地使用外部 API。
  3. 您的代码无法处理程序在任一睡眠周期中被中断的情况。我在下面的代码中添加了 try-catch 块,但不确定在这种情况下您喜欢做什么,所以我留在了 TODO 自动生成的注释中。

这是我想出的代码(我添加了一些 System.out 调用来帮助说明正在发生的事情):

import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
...

private static final LocalTime EIGHT_PM = LocalTime.of(20, 0);

public static void main(String[] args) {
    while(true){
        LocalTime now = LocalTime.now();
        if(now.isBefore(EIGHT_PM)){
            System.out.println(now + " It is before 8PM, sleeping 1 minute");
            try {
                TimeUnit.MINUTES.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else if(checkStatus()){
            System.out.println("It is 8PM or later and external process is done.");
            break;
        }else{
            System.out.println("It is 8PM or later, but external process is not done. Sleeping 15 minutes.");
            try {
                TimeUnit.MINUTES.sleep(15);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    // now print out
    System.out.println("Hello World");
}