Mon scénario est le suivant:terminaison Forceful d'un fil collé sur un appel API de quelque méthode
Je suis un serveur de mise en œuvre doit délai d'attente ou produire une réponse dans le délai spécifié pour chaque demande. Ainsi, chaque requête est assurée par une réponse du point de vue du serveur (la réponse, bien sûr, peut ne pas parvenir au client en raison d'une défaillance de la couche de transport, etc ...). Pour implémenter la sémantique ci-dessus, chaque requête engendre un thread (récupère en fait une thread disponible dans un pool de threads) et attend sa réponse via un notify sur un objet de synchronisation. La période d'attente est limitée avec un paramètre de délai d'attente envoyé à la méthode d'attente de l'objet. Le thread engendré délègue la requête à un objet qui sait comment gérer la requête. L'API d'appel de cet objet est connue, mais il n'existe aucun accord de niveau de service connu qui spécifie qu'un appel ne sera jamais suspendu indéfiniment. (Plus précisément dans mon cas, le serveur est en fait un client CORBA - mais ce n'est pas le point.)
Maintenant, ce qui m'intéresse, c'est de savoir s'il y a un moyen pour moi de détecter d'une façon ou d'une autre que ce fil n'est pas répondre et puis le tuer (l'interrompre) même si je suis actuellement bloqué sur un appel de méthode? Par ailleurs, je sais que je peux garder une référence à l'objet thread et après une durée pré-spécifiée appeler sa méthode interruption(). Malheureusement, cela ne garantit pas « interruption » sémantique ...
Java Thread Primitive Deprecation
Merci à tous
Je ne pense pas que l'appel de la méthode get() et le dépassement de délai provoquera alors le ExecutorService à considérer le thread émis à l'exécution de l'appelable comme récupérable. Ou est-ce? – Yaneeve
@Yaneeve, vous avez raison de ne pas contourner les problèmes que vous essayez d'éviter. – PSpeed
Il ne récupère pas le thread, mais votre serveur est en mesure de donner une réponse à son client dans le délai imparti, ce que j'ai compris était votre principale préoccupation. Et il est particulièrement agréable que cela fonctionne quel que soit le nombre d'appels externes, d'E/S disque ou de calculs effectués dans la logique métier du service (c'est-à-dire que vous obtenez une séparation des problèmes). Traiter avec le 'thread runaway' devient alors un problème d'implémentation, où interrupt() pourrait jouer son rôle (être bloqué sur un appel CORBA est probablement bloqué sur le réseau IO où l'interruption fonctionne normalement). –