2010-08-10 8 views
2

j'ai mis en place la classe suivante qui garde la trace du temps nécessaire pour exécuter un algorithmeCréation d'un fil pour la synchronisation et redémarrez un autre thread

public class MyTimer extends Thread{ 

    long timeElapsed = 0; 

    public MyTimer(String parameters){ 
     //initilise staff 
    } 

    pubic void run(){ 
     long startTime = System.currentTimeMillis(); 

     //DO SOME THINGS THAT TAKE TIME 

     timeElapsed = System.currentTimeMillis() - startTime; 
     System.out.println("time elapsed = " + timeElapsed"); 

    } 
} 

Quelques fois le MyTimer do prend vraiment beaucoup de temps, donc je aimerait créer une autre classe pour le contrôler. Si le MyTimer n'a pas fini en 30 secondes alors je voudrais arrêter le thread et le redémarrer avec de nouveaux paramètres. si elle se termine en moins de 30 secondes alors je voudrais pouvoir stocker le timeElapsed et redémarrer le MyTimer à nouveau. Je pensais que ce serait simple, mais je me suis trompé avec thread pools timeCountLathces et surveiller les exceptions ..... Donc, est-il possible que je peux le faire fonctionner? La solution alternative consiste à exécuter mes 500 tests un par un manuellement ....

Merci à l'avance

Répondre

2

probablement le problème qui rend votre vie plus difficile est que vous devez travailler est de savoir comment vous allez interruption votre long morceau de code? Si c'est dans une boucle qui est elle-même assez courte (c'est-à-dire boucle fréquemment), alors vous pouvez faire une vérification dans la boucle pour décider si vous voulez arrêter ou continuer. Ce serait idéal. Cependant, si la tâche longue s'exécute dans une base de données ou si une seule instruction java s'exécute depuis longtemps, alors vous devrez essayer le interrupting thread (par exemple monitoredThread.interrupt()). Interrompre un thread en cours d'exécution peut provoquer des erreurs, mais si le code se comporte bien, l'interruption l'empêchera de faire ce qu'il fait et de revenir.

espoir qui aide.

+0

Thread.stop() est depricated mais fonctionne très bien avec moi! Le code est juste pour économiser mon temps donc il n'y a aucun problème en utilisant la méthode d'arrêt. J'ai essayé d'interrompre mais ça ne marche pas car c'est une fonction recusive que je veux arrêter. Je pourrais utiliser une vérification dans la boucle, mais je ne veux pas jouer avec l'autre programme. Merci pour l'aide – Pitelk

0

Vous devriez envisager d'exécuter vos tests/construire avec Hudson. Vous pouvez configurer votre build Hudson (vos 500 tests) pour qu'il expire automatiquement s'il n'est pas terminé après une période de temps personnalisable. Bien sûr, vous n'obtenez pas l'échec test par test, car chaque test ne sera pas donné arbitrairement 30 secondes mais vous utiliserez l'intégration continue qui est un pas dans la bonne direction.

Hudson prend environ 5 minutes pour télécharger et configuration: http://hudson-ci.org/

+0

merci pour la réponse .. je vais y regarder – Pitelk