只有在满足条件时才打印hello world

时间:2016-10-01 03:35:24

标签: java jodatime sleep

我希望仅在以下两个条件均为真时打印出"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是否成为现实。

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

可能会这样帮助你。

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

答案 2 :(得分:0)

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

  

否则我将继续睡觉,直到上述两种情况都成立为止

我接受上述引用意味着您希望您的程序始终处于睡眠状态,除非它是晚上8点或更晚(当地时间)并且checkStatus方法返回true

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

  1. 您的原始代码,如果在一小时后调用 - 例如下午4:59,则会睡20-(当前小时),直到晚上8点或更晚。所以它会在4:59到8:59之间睡觉,因为20 - 16 = 4.你几乎整整一个小时就可以检查外部过程的状态。让你的代码一次睡眠1分钟不应该影响CPU使用率 - 如果你担心这一点,那么你真的需要更快的CPU或释放一些CPU - 并且会阻止你失去这么多如果你在一小时结束时调用你的程序的时间。
  2. 当您可以非常轻松地使用JRE附带的Java API来完成您想要做的事情时,我不知道您为什么要使用Joda时间。在我的代码中,我使用了Java API,因为我不想在没有充分理由的情况下使用外部API。
  3. 您的代码无法处理程序在任何一个睡眠周期中被中断的情况。我在下面的代码中添加了try-catch块,但不确定在这种情况下你喜欢做什么,所以我留下了TODO自动生成的注释。
  4. 这是我提出的代码(我添加了一些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");
    }