仅在满足条件时打印 hello world
print hello world only when conditions are met
我只想在以下两个条件都为真时打印出来"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
是否变为真。
应用程序中存在错误,如果恰好在上午 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 件事:
- 您的原始代码,如果在一个小时后调用 - 例如 4:59pm 将休眠 20-(当前时间)直到晚上 8 点或更晚。所以它将从 4:59 休眠到 8:59,因为 20 - 16 = 4。你几乎失去了整整一个小时,你本可以检查你的外部进程的状态。让您的代码一次休眠 1 分钟应该不会对 CPU 使用产生太大影响 - 如果您担心这一点,那么您确实需要获得更快的速度 CPU 或释放一些 CPU - 如果您在接近小时结束时调用您的程序,将防止您浪费太多时间。
- 我不知道你为什么要使用 Joda 时间,而你可以很容易地使用 JRE 中包含的 Java API 来完成你想做的事情。在我的代码中,我使用了 Java API,因为我不喜欢无缘无故地使用外部 API。
- 您的代码无法处理程序在任一睡眠周期中被中断的情况。我在下面的代码中添加了 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");
}
我只想在以下两个条件都为真时打印出来"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
是否变为真。
应用程序中存在错误,如果恰好在上午 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 件事:
- 您的原始代码,如果在一个小时后调用 - 例如 4:59pm 将休眠 20-(当前时间)直到晚上 8 点或更晚。所以它将从 4:59 休眠到 8:59,因为 20 - 16 = 4。你几乎失去了整整一个小时,你本可以检查你的外部进程的状态。让您的代码一次休眠 1 分钟应该不会对 CPU 使用产生太大影响 - 如果您担心这一点,那么您确实需要获得更快的速度 CPU 或释放一些 CPU - 如果您在接近小时结束时调用您的程序,将防止您浪费太多时间。
- 我不知道你为什么要使用 Joda 时间,而你可以很容易地使用 JRE 中包含的 Java API 来完成你想做的事情。在我的代码中,我使用了 Java API,因为我不喜欢无缘无故地使用外部 API。
- 您的代码无法处理程序在任一睡眠周期中被中断的情况。我在下面的代码中添加了 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");
}