No cree los hilos usted mismo. Recomiendo que use el marco fork/join (jsr166y) y cree tareas que iteren sobre un rango determinado de elementos. Se ocupará de la gestión de subprocesos por usted, utilizando tantos subprocesos como sea compatible con el hardware.
La granularidad de la tarea es el problema principal aquí. Si cada iteración tiene un cálculo relativamente bajo (digamos, menos de 100 operaciones), el hecho de que cada iteración se ejecute como una tarea separada introducirá una gran cantidad de sobrecarga en la programación de tareas. Es mejor que cada tarea acepte una Lista de argumentos para calcular y devolver el resultado como una lista. De esta forma, puede hacer que cada tarea calcule 1, 10 o miles de elementos para mantener la granularidad de la tarea a un nivel razonable que equilibre mantener disponible el trabajo y reducir la sobrecarga de administración de tareas.
También hay una clase ParallelArray en jsr166z, que permite el cálculo repetido en una matriz. Eso puede funcionar para usted, si los valores que está computando son tipos primitivos.
El primer bucle, incluso se puede sustituir por una sola llamada a 'invokeAll()'. –
@ Péter: en la mayoría de los casos, tendrá que ejecutar un bucle para compilar todos los invocables de todos modos, también podría enviarlos en ese momento. –
cierto, a menos que uno quiera separar la preparación de tareas de su procesamiento. –