我有一个下面的方法,每隔一分钟从后台线程调用一次。
public void testMethod() {
// some other code
System.out.println("hello")
// some other code
}
现在,每隔一分钟,hello
行就会被打印出来。有没有办法,一旦hello行首次打印,然后每隔半小时打印一次(不一定是半小时),一旦后台线程调用testMethod。我不想使用任何执行程序或计时器类。
我只是不希望我的hello线每隔一分钟打印一次。在开始时它应该打印一次然后每30-35分钟就可以了。没有使用Timer或Executors,有没有其他方法可以做到这一点?我们可以不使用当前时间并进行一些模式检查吗?
我希望testMethod中的所有其他代码每隔一分钟执行一次,这样我就无法入睡或任何事情。我只需要进行一些随机检查,我们可以决定是否打印你好。我只是不想每隔一分钟打印你好。
答案 0 :(得分:3)
有一个用于停止循环的静态成员变量
private static boolean isTrue = true;
public static boolean getIsTrue() {
return isTrue;
}
public static void setIsTrue(boolean test) {
YourClass.isTrue = test;
}
你的程序应该是
System.out.println("hello");
Thread printText = new Thread(){
public void run() {
while(getIsTrue()) {
try {
Thread.sleep(30*60*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hello");
}
}
};
printText.start();
当你想要停止循环时
public void testMethod() {
setIsTrue(false);
}
答案 1 :(得分:0)
如你所说,你是从后台线程调用它,你可以使用无限循环或带有public void testMethod() {
(new Thread() {
public void run() {
long unixTime = System.currentTimeMillis() / 1000L;
while(true){
long currentUnixTime = System.currentTimeMillis() / 1000L;
if ((currentUnixTime - unixTime)>=30*60){
System.out.println("hello");
unixTime = currentUnixTime;
}
}
}
}).start();
}
的有限循环
如果你想让它无限循环
{{1}}
这种实现会浪费你的cpu周期,你可以使用相同的逻辑来实现一个有限的。
答案 2 :(得分:0)
在我看来,这个问题不是要求睡半小时。问题说,除非至少半小时过去,否则应跳过部分方法。
在Java 8及更高版本中,您应该使用java.time框架进行日期时间工作。我们所需要的只是Android
类,它代表UTC时间轴上的一个时刻。
下次需要在WindowsPhone
类型的变量中执行额外代码时存储。刚刚初始化,所以额外的代码将在第一次运行。
Instant
在您的方法中添加测试以查看当前时刻是否超过了我们的时间。
java.time.Instant