Java: conception pour utiliser de nombreux services d'exécuteurs et seulement quelques threads


J'ai besoin d'exécuter en parallèle plusieurs threads pour effectuer quelques tests.

Mon 'moteur de test' aura n tests à effectuer, chacun faisant k sous-tests. Chaque résultat de test est stocké pour une utilisation ultérieure.

J'ai donc n*k processus qui peuvent être exécutés simultanément.

J'essaie de comprendre comment utiliser efficacement les outils concurrents java.

En ce moment, j'ai un service d'exécuteur au niveau du test et n service d'exécuteur au niveau du sous-test.

Je crée ma liste d'appelables pour le niveau de test. Chaque appelable de test créera ensuite une autre liste d'appelables pour le niveau de sous-test. Lorsqu'il est invoqué, un appelable de test appellera par la suite tous les appelables de sous-test

  • épreuve 1
    • sous-test a1
    • sous-test ...1
    • sous-test k1
  • essai n
    • sous-test a2
    • sous-test ...2
    • sous-test k2

La séquence d'Appel:

  • gestionnaire de test créer un test 1 appelable
    • test1 appelable créer un sous-test a1 à k1
    • testn appelable créer un sous-test à kn
  • le gestionnaire de test appelle tous les appelables de test
    • test1 appelable invoque tous les sous-tests a1 à k1
    • testn appelable invoque tous les sous-tests an à kn

Cela fonctionne bien, mais j'ai beaucoup de nouvelles bandes de roulement qui sont créés.

Je ne peux pas partager le service executor car je dois appeler 'shutdown' sur exécuteur.

Mon idée pour résoudre ce problème est de fournir le même pool de threads de taille fixe à chaque service executor.

Pensez-vous que c'est un bon modèle ? Est-ce que je manque quelque chose de plus approprié/simple pour le faire ?

Author: Guillaume, 2010-06-08

1 answers

Utilisez un seul exécuteur de pool de threads fixe. Évitez d'appeler shutdown, si vous faites cela, vous avez probablement une erreur.

Voici un pseudo-code qui est ma meilleure estimation de ce que vous voulez avec le peu d'informations publiées.

main () {
    ArrayList<Future<?>> futures = new ArrayList<Future<?>>();
    ExecutorService exec = Executors.newFixedThreadPool(Runtime.getNumProcessors())
    futures.add(exec.submit(Test1));
    ...
    futures.add(exec.submit(Testn));

    for (Future<?> future:futures) {
       ? result = future.get();
    }
}
 4
Author: Tim Bender, 2010-06-09 17:18:01