Ne créez pas les unités vous-même. Je vous recommande d'utiliser le framework fork/join (jsr166y) et de créer des tâches qui parcourent une gamme donnée d'éléments. Il prendra soin de la gestion des threads pour vous, en utilisant autant de threads que les supports matériels.
La granularité de la tâche est le problème principal ici. Si chaque itération est un calcul relativement faible (disons moins de 100 opérations), alors l'exécution de chaque itération comme une tâche distincte introduira beaucoup de temps supplémentaires dans l'ordonnancement des tâches. Il est préférable que chaque tâche accepte une liste d'arguments à calculer et renvoie le résultat sous forme de liste. De cette façon, vous pouvez faire en sorte que chaque tâche calcule 1, 10 ou des milliers d'éléments, pour maintenir le volume de tâches à un niveau raisonnable qui équilibre la disponibilité du travail et réduire les frais généraux de gestion des tâches.
Il existe également une classe ParallelArray dans jsr166z, qui permet des calculs répétés sur un tableau. Cela peut fonctionner pour vous, si les valeurs que vous calculez sont des types primitifs.
La première boucle peut même être remplacé par un seul appel à 'invokeAll()'. –
@ Péter: dans la plupart des cas, vous devrez exécuter une boucle pour construire tous les Callable de toute façon, aussi bien les soumettre à ce moment-là. –
vrai, sauf si l'on veut séparer la préparation des tâches de leur traitement. –