Thread et ordre d'insertion dans un arrayList
Salut, j'ai une boucle qui itère la récupération un objet d'une méthode pour l'insérer dans un ArrayList :
Code:
1 2 3 4 5
|
for (int i = 0; i < this.nbChannel; i++)
{
homoDistances .add(computeOneChannelHomoDistances(i));
} |
L'ordre d'insertion dans l'ArrayList est important. Je souhaite paralléliser cela en lançant chaque traitement getMonObject de la boucle dans un thread. Dans ce cas l'ordre d'insertion dans l'arraylist monArray se fera en fonction de l'ordre de fin de traitement de getMonObject(i) de chaque trhead donc pas toujours le même et imprévisible.
Comment faire pour insérer "dans le bon ordre" (ordre de la boucle) ces objets récupérés depuis des threads qui finissent un peu quand ils veulent ?
Pour l'instant je fais ça en stockant mes objets dans un tableau que je parcoure après avoir attendu la fin de tous les threads (latcher). J'utilise alors le tableau comme source pour insérer dans le bon ordre les objets dans mon ArrayList.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
final FishDistanceSet[] homoDistancesTab = new FishDistanceSet[this.nbChannel];
final CountDownLatch latcher = new CountDownLatch(nbChannel);
//Homologous distances
for (int i = 0; i < this.nbChannel; i++)
{
final int j;
j=i;
Thread th = new Thread(new Runnable()
{
public void run()
{
homoDistancesTab[j]=computeOneChannelHomoDistances(j);
latcher.countDown();
logInfo("channel " + j + " homodistances processed");
}
}, "computing all channel homodistances");
th.start();
}
// lets wait all channels are processed
try
{
logInfo("waiting all channels homodistances are processed ...");
latcher.await();
logInfo("All channels homodistances processed");
} catch (InterruptedException e)
{
e.printStackTrace();
}
homoDistances = new ArrayList<FishDistanceSet>();
for (int i = 0; i < this.nbChannel; i++)
{
homoDistances.add(homoDistancesTab[i]);
} |
Ça marche mais il me semble qu'il doit y avoir plus simple non ?
PS : j'ai toujours du mal avec la visibilité des variables depuis un thread, le mot clé final me pose souvent des problèmes ..
merci pour vos suggestions