si je devais paralléliser ça, je le ferais de cette manière:
1) créer un ExecutorService avec un certain nombre de threads
ExecutorService pool = Executors.newFixedThreadPool(nbThreads);
2) dans la boucle extérieure, au lieu de mettre les boucle intérieur, mettre en queue sur l'exécutor un Runnable qui fait la partie intérieure. Comme toutes les itérations internes sont indépendantes, ca ne devrais pas poser de soucis.
3) faire un shutdown du service et attendre (awaitTemination) que toutes les tâches soient effectuées
4) retourner la valeur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Matrix res = new Matrix(table);
int k,i,j;
long value = 0;
for (k=0; k<this.getNumberOfColumns(); k++){
pool.execute(new ColumnMultiplication(this,table,res,k));
/* a mettre dans columnMultiplication
for (i=1; i<this.getNumberOfLines()+1; i++){
for (j=0; j<this.getNumberOfColumns(); j++)
value += this.matrix[i-1][j]*m.matrix[j][k];
res.matrix[i-1][k] = value;
value = 0;
}*/
}
pool.shutdown();
while(true){
if (pool.awaitTemination(60,TimeUnit.Seconds))
return res;
}
} |
Partager