2010-04-29 9 views
2

Je crée un fil pour mon application qui va faire une opération de sortie à un moment donné (seules les heures et les minutes, le jour/le mois n'a pas d'importance). Est-ce la bonne façon de le faire, et aussi la bonne façon de tester le temps? Je suis en train de tester une horloge 24 heures sur 24, pas AM/PM.Test de thread pour le temps

Je suis alors dans une autre classe va appeler quelque chose comme nouveau 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

Je vois déjà une grosse faute dans mon code, je dois mettre à jour le currentTime dans ma boucle. – DanielFH

Répondre

1

Vous pouvez recalcule currentTime dans la boucle while :-)

Au lieu d'attendre 10 secondes avant de vérifier l'état de fin, vous pouvez déterminer les Millis qui correspondent à votre heure de fin, et attendre la nombre de millies entre maintenant et l'heure de fin.

Si votre temps de fonctionnement se situe entre 235950 et 235959, vous risquez de le manquer.

mise à jour

Vous pouvez déterminer le nombre de Millis à attendre de cette façon:

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; 

Notez que vous devez calculer cela dans la boucle while aussi, parce que le sommeil peut être interrompu l'itération suivante aura besoin d'un temps de sommeil plus petit.

+0

Mis à jour la boucle while :) Je ne sais pas comment j'implémenterais cette dernière partie. Je vais essayer. – DanielFH

+0

Mise à jour du code. Testé et cela fonctionne. Merci du coup de main jusqu'à présent. S'il vous plaît laissez-moi savoir si vous voyez une marge de progression :) – DanielFH

+0

@DanielFH, comme amélioration, vous pouvez vous débarrasser complètement des méthodes getDate et exitDate en utilisant 'if (sleepTime() <= 0)'. – rsp

1

Pour testabilité, vous devez injecter deux choses: un "sommeil" et une "horloge". Ceux-ci pourraient être dans la même interface si vous voulez, ou séparer. L'implémentation de production utiliserait simplement Thread.sleep et System.currentTimeMillis, mais cela signifie que vous pouvez également créer de fausses implémentations, ce qui rend le code testable.

0

Peut-être que vous devriez envisager d'utiliser un Timer

Questions connexes