[Thread] traitement parallele avec executors
Voila, j'ai un grand tableau de double qu'on notera data,
J'applique un traitement lourd sur chaque element du data
Code:
1 2 3 4 5 6
|
double[] data;
remplirData();
for(int i=0 ; i<data.length; i++){
double resultat = traitementlourd(data[i]);
} |
Afin d'optimiser ce traitement qui dure quelques secondes (15s), j'ai pensé à utiliser le multi-threading, çad diviser le traitement sur plusieurs threads et chaque thread pas s'occuper d'une partie du tableau;
Code:
1 2 3 4 5 6 7 8 9 10
|
ouble[] data;
remplirData();
ExecutorService executor = Executors.newFixedThreadPool(2);
int size = data.length;
TraitementWorker worker1 = new TraitementWorker(0, size / 2);
TraitementWorker worker2 = new TraitementWorker(size /2 +1 ,size - 1);
executor.execute(worker1);
executor.execute(worker2);
executor.shutdown(); |
Je croyais que ce code va parralléliser les traitements et j'obtiendrai un certain gain de perfs. Mais voilà, les deux threads s'executent chaqune en 15 secondes . Lorsque je lance un seul : 7s
Est-ce que mon raisonnement est faux ou c'est qq chose d'autre ?
Executors.newFixedThreadPool
L'usage d'Executors est simple et super pratique.
Voici un exemple de code. C'est un copier/coller alors il va manquer quelques variables mais tu as comme ça le patron d'usage.
L'idée est des remplir un tableau de "Callables" et de le passer à l'Executor qui va utiliser sont pool de thread.
Le bout de code permet de vérifier des signatures SDA en parallèle (j'ai des machines multiproc).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
int thCount = 10;
ExecutorService e = Executors.newFixedThreadPool( thCount );
ArrayList<Callable<Boolean>> callables = new ArrayList<Callable<Boolean>>();
for( int j = 0; (j < thCount*100) && (j < loopCount); j++ , callablesCount++ )
{
callables.add( new DSASignCheck( publicKey, sign, message) );
}
List<Future<Boolean>> results = e.invokeAll( callables );
for( Future<Boolean> f : results )
{
if( f.get() == Boolean.FALSE )
{
System.out.println("La signature de match pas");
}
} |