2009-12-22 3 views
2

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

Répondre

3

Je pense que si vous ne pouvez pas compter sur interruption() sémantique alors vous pouvez être hors de la chance. Il n'y a pas de moyen fiable ou sûr de terminer avec force un thread. C'est dangereux dans n'importe quelle langue.

J'espère que l'interruption() vous apportera ce dont vous avez besoin même si elle peut être contournée. Les appels CORBA doivent passer par les classes de réseau standard et doivent donc être correctement interrompus lors de tout appel bloquant.

C'est le meilleur que vous pouvez faire à court d'engendrer des processus enfants complets.

2

Essayez d'utiliser un ExecutorService et faire se faire la logique métier réelle dans un appelable. L'avenir retourné par la ExecutorService a une get() qui vous permet de spécifier combien de temps vous attendre ...

+0

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

+0

@Yaneeve, vous avez raison de ne pas contourner les problèmes que vous essayez d'éviter. – PSpeed

+0

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). –

Questions connexes