Java 时间线程测试
我正在为我的应用程序创建一个线程,该线程将在给定的时间执行退出操作(只有小时和分钟,天/月不重要)。这是正确的方法吗?也是测试时间的正确方法吗?顺便说一下,我在测试24小时制,不是上午/下午 然后我在另一节课上,把这个叫做 新线程(newexitthread()).start()Java 时间线程测试,java,date,multithreading,Java,Date,Multithreading,我正在为我的应用程序创建一个线程,该线程将在给定的时间执行退出操作(只有小时和分钟,天/月不重要)。这是正确的方法吗?也是测试时间的正确方法吗?顺便说一下,我在测试24小时制,不是上午/下午 然后我在另一节课上,把这个叫做 新线程(newexitthread()).start() }对于可测试性,您应该注入两样东西:一个“睡眠者”和一个“时钟”。如果需要,它们可以在同一个接口中,也可以分开。生产实现将只使用Thread.sleep和System.currentTimeMillis,但这意味着您也
}对于可测试性,您应该注入两样东西:一个“睡眠者”和一个“时钟”。如果需要,它们可以在同一个接口中,也可以分开。生产实现将只使用
Thread.sleep
和System.currentTimeMillis
,但这意味着您也可以创建伪实现,从而使代码可测试。您可能需要在循环时在内重新计算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循环中计算这一点,因为睡眠可以中断,下一次迭代需要更小的时间睡眠。
也许你应该考虑使用< /p>我已经在代码中看到了一个大错误,我需要更新循环中的currenttime。更新了while循环:)但不确定如何实现最后一部分。将尝试一下。更新了代码。测试它,它的工作。谢谢你迄今为止的帮助。请让我知道您是否有改进的余地:)@DanielFH,作为改进,您可以使用if(sleepTime()完全取消getDate和exitDate方法
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;