【问题标题】:print hello world only when conditions are met仅在满足条件时打印 hello world
【发布时间】:2017-02-09 16:42:10
【问题描述】:

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

  • 如果当前时间大于或等于晚上 8 点。
  • 如果isDone 变为真。这来自另一个服务,主要是检查某个进程是否完成。

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

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 是否变为真。

【问题讨论】:

  • @c0der 不明白?你能解释一下这是什么意思吗?
  • 是否保证checkStatus在4小时内为真?否则,如果需要更长时间,则会在不适当的时间打印。
  • 不,不能保证在 4 小时内或任何时间它都是真的。但我仍然会继续睡觉,直到它成为现实。我们将监控 checkStatus 过程中是否存在任何问题,如果有任何问题,我们将停止整个过程。这只是为了解释这个想法。

标签: java jodatime sleep


【解决方案1】:

应用程序中有一个错误,如果它恰好在上午 8 点之后,但 checkStatus 在午夜之前没有返回 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");

【讨论】:

  • 你对这条线isDone = hour &lt; 20;的逻辑是否正确?好像不对?
【解决方案2】:

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

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");

【讨论】:

    【解决方案3】:

    您的代码要求并不完全清楚,因为您的原始帖子没有指定如果 checkStatus 在午夜之前没有返回 true,您是否希望您的代码停止。我根据您的原始帖子编写了以下解决方案:

    否则我会一直睡觉直到以上两个条件都成立

    我认为上面的引用意味着您希望您的程序一直处于休眠状态,除非它是晚上 8 点或更晚(当地时间)并且checkStatus 方法返回true

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

    1. 您的原始代码,如果在一个小时的晚些时候调用 - 例如下午 4:59 将休眠 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 自动生成的 cmets 中。

    这是我想出的代码(我添加了一些 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");
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2018-03-11
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多