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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for (int i = 0; i < this.nbChannel; i++) { homoDistances .add(computeOneChannelHomoDistances(i)); }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager