Je veux faire fonctionner un fil pendant une durée déterminée. S'il n'est pas terminé dans ce délai, je veux soit le tuer, soit lancer une exception, soit le traiter d'une manière ou d'une autre. Comment cela peut-il être fait ?
Une façon de le faire, comme je l'ai compris à partir de ce fil est d'utiliser une TimerTask dans la méthode run() du Thread.
Existe-t-il de meilleures solutions pour cela ?
EDIT : Ajout d'une prime car j'avais besoin d'une réponse plus claire. Le code ExecutorService donné ci-dessous ne répond pas à mon problème. Pourquoi devrais-je dormir() après avoir exécuté (un certain code - je n'ai aucun contrôle sur ce morceau de code) ? Si le code est terminé et que le sleep() est interrompu, comment cela peut-il être un timeOut ?
La tâche qui doit être exécutée n'est pas sous mon contrôle. Il peut s'agir de n'importe quel morceau de code. Le problème, c'est que ce morceau de code peut se retrouver dans une boucle infinie. Je ne veux pas que cela se produise. Donc, je veux juste exécuter cette tâche dans un thread séparé. Le thread parent doit attendre que le thread se termine et doit connaître l'état de la tâche (c'est-à-dire s'il y a eu un dépassement de temps, une exception ou un succès). Si la tâche entre dans une boucle infinie, mon thread parent continue d'attendre indéfiniment, ce qui n'est pas une situation idéale.
0 votes
EDIT : Ajout d'une prime car j'avais besoin d'une réponse plus claire. Le code ExecutorService donné ci-dessous ne répond pas à mon problème. Pourquoi devrais-je sleep() après avoir exécuté mon code ? Si le code est terminé et que le sleep() est interrompu, comment cela peut-il être un timeOut ?
7 votes
Ce
sleep()
était juste un stub pour représenter "une tâche qui s'exécute depuis longtemps". Remplacez-le simplement par votre vraie tâche ;)1 votes
... une "tâche de longue haleine" qui se trouve répondre à
interrupt()
mais ce n'est pas le cas de tous les appels "bloquants", comme j'ai essayé de le souligner dans ma réponse. Les spécificités de la tâche que vous essayez d'interrompre font une énorme différence dans l'approche à utiliser. Plus d'informations sur la tâche seraient utiles.0 votes
Si ces réponses ne résolvent pas le problème, alors je pense que plus de détails/code devraient aider à répondre.
0 votes
Ces threads que vous voulez limiter dans le temps, font-ils des appels bloquants, ou sont-ils dans une boucle où vous pourriez facilement vérifier une variable pour voir s'il est temps d'arrêter ?
0 votes
@java_geek : la réponse est-elle maintenant plus claire ?