我正在为我的应用程序创建一个线程,该线程将在给定时间执行退出操作(仅小时和分钟,天/月无关紧要)。这是正确的做法,也是测试时间的正确方法吗?顺便说一句,我正在测试 24 小时制,而不是上午/下午。
然后我在另一个类上将其称为 新线程(新的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 循环中计算它,因为 sleep 可能会被打断,下一次迭代将需要更小的 timeToSleep。
关于java - 线程测试时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2735632/