Ik heb problemen met joins en threadgroups. Ik moet 10 verschillende computerspelers een potje reversi laten spelen tegen 10 andere computerspelers. Hierdoor heb ik 100 verschillende partijen. Omdat ik verschillende van dit soort toernooitjes moet laten spelen wil ik dit optimaliseren met threads. Ik maak voor iedere partij een thread aan. Dit kan makkelijk, want de partijen hebben geen enkele informatie van elkaar nodig. Ik merk zelfs op een singlecore processor dat het sneller gaat, maar het is vooral de bedoeling om snelheidswinst te behalen op dualcores (en die heb ik tijdelijk niet). Na deze 100 threads moet alles weer gelijk lopen. Ik moet de punten enzo uitrekenen en dat kan pas als alle partijen zijn afgelopen. Op zich kun je met join op een thread wachten tot deze klaar is voordat de rest van de code wordt uitgevoerd. Ik heb echter 100 threads die wel allemaal door elkaar mogen lopen, maar er kan pas verder gegaan worden als ze allemaal klaar zijn. Ik dacht daarom dat een threadgroup de enige oplossing is. Ik doe al deze threads in een threadgroup, die op zijn beurt ook een thread is. Op deze thread kan dan wel afzonderlijk gewacht worden. Echter kan ik heel weinig vinden op het internet over threadgroups en het wil dan ook niet lukken. Mijn code:
Dit is mijn code waar de verkeerde volgorde wordt uitgevoerd:
Levert op:
En ik wil natuurlijk dat er het volgende gebeurt.
End mag pas worden weergegeven als alle partijen die gespeeld worden in SpelThread zijn uitgevoerd. Ik dacht het volgende met ThreadGroup maar het werkt niet:
En dit levert dezelfde uitvoer op als in mijn eerdere code. Wat doe ik verkeerd?
Dit is mijn code waar de verkeerde volgorde wordt uitgevoerd:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Thread[] threadList; threadList = new Thread[100]; int t=0; for(Speler z: zwartSpelers){ for(Speler w: witSpelers){ SpelThread s = new SpelThread(z, w, generatie); threadList[t] = new Thread(s); threadList[t].start(); t++; } } System.out.println("end"); |
Levert op:
code:
1
2
3
4
5
6
7
| end Partij 1 Partij 2 . . . enz. |
En ik wil natuurlijk dat er het volgende gebeurt.
code:
1
2
3
4
5
6
7
8
| Partij 1 Partij 2 . . . Partij 99 Partij 100 end |
End mag pas worden weergegeven als alle partijen die gespeeld worden in SpelThread zijn uitgevoerd. Ik dacht het volgende met ThreadGroup maar het werkt niet:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| Thread[] threadList; ThreadGroup threadGroup; threadList = new Thread[100]; threadGroup = new ThreadGroup("toernooi"); int t=0; for(Speler z: zwartSpelers){ for(Speler w: witSpelers){ SpelThread s = new SpelThread(z, w, generatie); threadList[t] = new Thread(threadGroup, s); threadList[t].start(); t++; } } Thread toernooi = new Thread(threadGroup, "naam"); toernooi.start(); try{toernooi.join();}catch(Exception e){} System.out.println("end"); |
En dit levert dezelfde uitvoer op als in mijn eerdere code. Wat doe ik verkeerd?