8
votes

Meilleures façons de gérer le temps d'exécution maximal pour les threads (en Java)

Alors, je suis curieux. Comment gérez-vous la définition du temps d'exécution maximum pour les fils? Lorsque vous courez dans une piscine de fil?

J'ai plusieurs techniques, mais je ne suis jamais assez satisfait d'eux. Donc, je montre que je demanderais à la communauté comment ils se passent à ce sujet.


0 commentaires

3 Réponses :


3
votes

Normalement, je viens de sonder régulièrement un objet de contrôle du code fileté. Quelque chose comme: xxx


0 commentaires

5
votes

Du:

Soumettez votre appelable code> au exécutorservice CODE> et gardez une poignée au futur renvoyé code>. p> xxx pré>

envelopper le futur code> dans une implémentation de retardé code> dans laquelle retardé code> 's getdelay (timeunit) code> Méthode renvoie l'heure d'exécution maximale pour le travail en question. P>

new Thread(new Runnable() {
  public void run() {
    while (!Thread.interrupted) {
      DelayedImpl impl = queue.take(); // Perform blocking take.
      if (!impl.getFuture().isDone()) {
        impl.getFuture().cancel(true);
      }
    }
  }
}).start();


2 commentaires

Futur.get (longue timeout, unité du fuseau horaire) qui lance le temps d'expression à l'heure fera sûrement cela? Je présume dans la prise pour cette exception que vous appelez fubl.cancel (vrai) ...


Future.get (Long, TimeUnit) bloquera jusqu'à une heure spécifiée pour que Future spécifique à compléter. Cependant, la solution que j'ai ajoutée vous permet d'avoir une seule vérification du fil tous les appelables en cours plutôt que Blocage sur un spécifique. Supposons que je soumettais un appelable qui devrait prendre 5 minutes; Dans mon thread "check", j'appelle futurs.get (5L, TimeUnit.minutes). Une autre appelable est ensuite soumise avec une durée d'exécution maximale de 10 secondes. Cependant, le thread ne cherche pas si cette seconde appelable est exécutée depuis> 10 secondes jusqu'à ce que l'appel de blocage précédent soit renvoyé.



4
votes

Adamski:

Je pense que votre implémentation de l'interface retardée nécessite un ajustement afin de fonctionner correctement. La valeur de retour de 'getdelay ()' doit renvoyer une valeur négative si la quantité de temps écoulée de l'instanciation de l'objet a dépassé la durée de vie maximale. Pour y parvenir, vous devez stocker le temps lorsque la tâche a été créée (et probablement démarré). Ensuite, chaque fois 'getdelay ()' est invoqué, calculez si la durée de vie maximale du fil a été dépassée ou non. Comme dans: xxx


0 commentaires