线程测试的时间
问题描述:
我正在为我的应用程序在给定时间执行退出操作(只有小时和分钟,日/月无关紧要)的线程。这是做这件事的正确方法,也是测试时间的正确方法吗?顺便说一句,我正在测试24小时制,而不是AM/PM。线程测试的时间
我然后在另一个类去调用这个东西像 new Thread(new ExitThread())。start();
public class ExitThread implements Runnable {
public long getDate() {
Date thisdate = new Date(System.currentTimeMillis());
return thisdate.getTime();
}
public long exitDate() {
Date exitdate = new Date(System.currentTimeMillis());
exitdate.setHours(23);
exitdate.setMinutes(30);
exitdate.setSeconds(0);
return exitdate.getTime();
}
public long sleepTime() {
Calendar cal = Calendar.getInstance();
long now = cal.getTime().getTime();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long endMillis = cal.getTime().getTime();
long timeToSleep = endMillis - now;
return timeToSleep;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(sleepTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
if (getDate() >= exitDate()) {
// System exit method here
}
}
}
}
答
您可能希望将
while
循环内重新计算
currentTime
:-)
不是检查结束条件之前等待10秒钟,就可以确定符合您的结束时间米利斯,并等待从现在到结束时间之间的毫秒数。
如果您的结束时间介于235950和235959之间,您有可能会错过它。
更新
您可以决定用这种方式来等待米利斯数量:
Calendar cal = Calendar.getInstance();
long now = cal.getTime().getTime();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long endMillis = cal.getTime().getTime();
long timeToSleep = endMillis - now;
请注意,您需要在while循环也内计算出这一点,因为睡眠可以被打断下一次迭代将需要更小的timeToSleep。
答
可测性,你应该注入两件事情:一个 “潜伏” 和 “时钟”。这些可以在相同的界面中,如果你想要或分开。生产实现只使用Thread.sleep
和System.currentTimeMillis
,但这意味着您也可以创建伪造的实现,从而使代码可测试。
我已经看到我的代码,一个大错,我需要在我的循环更新CURRENTTIME。 – DanielFH 2010-04-29 08:05:59