线程测试的时间

问题描述:

我正在为我的应用程序在给定时间执行退出操作(只有小时和分钟,日/月无关紧要)的线程。这是做这件事的正确方法,也是测试时间的正确方法吗?顺便说一句,我正在测试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 
     } 
    } 
} 

}

+0

我已经看到我的代码,一个大错,我需要在我的循环更新CURRENTTIME。 – DanielFH 2010-04-29 08:05:59

您可能希望将 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。

+0

更新了while循环:)不知道如何实现最后一部分。会试试看。 – DanielFH 2010-04-29 08:28:26

+0

更新了代码。测试它,它的工作原理。感谢你目前的帮助。请让我知道,如果你看到任何改善空间:) – DanielFH 2010-04-29 10:27:16

+0

@DanielFH,作为改进,你可以通过使用if(sleepTime() rsp 2010-04-29 10:57:53

可测性,你应该注入两件事​​情:一个 “潜伏” 和 “时钟”。这些可以在相同的界面中,如果你想要或分开。生产实现只使用Thread.sleepSystem.currentTimeMillis,但这意味着您也可以创建伪造的实现,从而使代码可测试。

也许你应该考虑使用Timer