2008-11-27 3 views
1

J'ai un webservice qui fait plusieurs petits calculs avant de retourner le résultat. Je veux utiliser le ExecutorService fourni par Executors.newFixedThreadPool() comme un moyen d'implémenter le modèle maître-ouvrier (c'est-à-dire appeler invokeAll et laisser le thread attendre que tous les résultats soient terminés). Idéalement, tous les threads de service Web utilisent le même service d'exécution de sorte qu'ils ne doivent pas tous créer leur propre pool de threads et qu'ils peuvent simplement partager un pool important qui utilise tout le temps de traitement du système.Est-ce qu'un java fixedThreadPool peut être utilisé par plusieurs threads?

Questions que j'ai avec cette approche:

  • est-il sûr d'accéder à la fonction invokeAll de plusieurs threads.
  • est-ce que le service d'exécution gère les requêtes de manière séquentielle (par exemple, toutes les tâches du thread 1, puis celles du thread
  • est-il possible d'avoir 10 threads de travail et d'avoir le nombre maximum de threads disponibles? nombre de demandes arrivant, disons que nous avons 1 requête, il utilise tous les 10 threads pour cette requête Si vous avez 2 demandes, il les divise 5 threads par demande, etc.

Répondre

1

Je ne dirais pas utiliser invokeAll Chaque requête appelle ExecutorService.submit pour chacune des sous-tâches que vous souhaitez effectuer en parallèle.Le pool de threads gère la planification des tâches (c'est ce à quoi elles sont conçues!).

Et oui, si vous utilisez Executors.newFixedThreadPool() chaque requête est placée dans une file d'attente, donc ils sont traités séquentiellement.

0

Je pense que vous devriez utiliser Semaphore plutôt que invokeAll()

2

En cas d'utilisation dans un serveur Java EE, vous ne devez pas créer de threads sur votre propre. Je me rends compte que ce n'est pas une bonne situation, vous devriez donc chercher des alternatives en fonction du serveur d'application que vous utilisez. S'il s'agit de WebSphere ou de Weblogic, vous devez utiliser le WorkManager de la spécification commonj, qui fournit la fonctionnalité exacte que vous souhaitez. Il existe également une implémentation pour JBoss.

Vous devriez envisager de créer vos propres threads dans un environnement géré en dernier recours.

Questions connexes