2010-06-04 2 views
4

J'ai créé plusieurs instances ExecutorService dans mon code, généralement chaque page d'interface utilisateur possède une instance ExecutorService. Chaque instance de ExecutorService exécutera des threads de requête http get.Est-il possible de créer plusieurs pools d'unités d'exécution (ExecutorService)?

private ExecutorService m_threadPool = Executors.newCachedThreadPool(); 

Est-il correct de le faire?

Le problème que j'ai rencontré est que parfois les requêtes HTTP get ont obtenu le code de réponse -1 à partir de l'appel HttpURLConnection getResponseCode(). Je ne sais pas s'il est provoqué par plusieurs instances de pool de threads.

Merci.

Répondre

3

ExecutorServiceen soi est juste un autre objet, donc il n'y a pas de gros frais généraux. Mais chaque pool de threads est livré avec un nombre de threads inactifs par défaut et ceux-ci sont la cause d'un gaspillage de ressources majeur. Je suggère de définir le nombre par défaut de threads pré-générés dans chaque pool small (1 ou 0 si vous n'êtes pas sûr si des demandes sont envoyées) afin de réduire le coût de création d'objets supplémentaires. Les threads seront créés à la demande et vous pourrez garder votre code propre.

Une autre solution consiste à utiliser un pool de threads unique, mais pour conserver une liste de tâches distincte pour chaque fenêtre de l'interface utilisateur. Dans ce cas, lorsque la fenêtre est fermée, vous devez parcourir toutes les tâches et les annuler manuellement (cela peut également être fait dans un thread séparé). Une tâche peut être représentée par un Future<?> (elle a des méthodes pratiques isDone() et cancel()).

1

Il ne doit pas être provoqué par vos instances de pool de threads. Cependant, je dirais qu'avoir plus d'un pool de threads est discutable. Pourquoi en aurais-tu besoin? Cela pourrait conduire à beaucoup de threads inutiles et, partant, à l'utilisation inutile de la mémoire.

+0

Je crée une instance ExecutorService pour chaque page d'interface utilisateur. Par conséquent, lorsque la page est fermée, je peux appeler m_threadPool.shutdown() pour annuler les threads de demande http pour cette page d'interface utilisateur. C'est mon but. Cette logique n'a pas encore été ajoutée à mon code, donc le code de réponse -1 ne doit pas non plus être causé par l'arrêt de threadPool. – user256239

Questions connexes