Hallo,
ich hab nun einen quadcore und will alle kerne zur berechnung nutzen. ich habe eine arraylist von objekten, diese unterteile ich in 4 bereiche und gebe jedem thread (habe 4 threads wegen 4 kerncpu) genau ein viertel der arraylist. die ganzen threads sind mit join() verknüpft. weiterhin rufe ich in einer schleife immer und immer wieder eine methode auf die diese threads neu startet um neue berechnungen zu machen. ich hatte schonmal einen threads "1000 threads oder iterativ" - hoffe also dass ich hier jetzt nicht mit einem neuen thread alle störe.
das problem ist: ich will permanente vollauslastung aller kerne haben. liegt es wohl am join() dass sagen wir am ende 3 threads auf den langsamsten thread waren, somit die auslastung von 99-100% runtergeht, der letzte thread fertig wird, die schleife erneut aufgerufen wird, alle threads wieder arbeiten, die schnellsten 3 wieder auf den langsamsten warten, cpu auslastung wieder runtergeht usw. hab hier ne abart sinuskurvige auslastung meiner 4 kerne.
hier ein bild:
der rote kasten zeigt die erzeugung von den 4 threads, alle werden gestartet und um blauen kasten gejoined. auf der linken seite sieht man meine threadklasse.
was für möglichkeiten habe ich? als ich die abarbeitung der arraylist nicht in 4 bereiche aufgeteilt habe sondern für jedes element ein eigenen thread erstellt habe (hatte dann so 1000 threads) wars einfach DEUTLICH schneller als mit 4 threads.
wie ist die richtige vorgehensweise, ich muss auf alle berechnung jedes threads warten.
ich hab nun einen quadcore und will alle kerne zur berechnung nutzen. ich habe eine arraylist von objekten, diese unterteile ich in 4 bereiche und gebe jedem thread (habe 4 threads wegen 4 kerncpu) genau ein viertel der arraylist. die ganzen threads sind mit join() verknüpft. weiterhin rufe ich in einer schleife immer und immer wieder eine methode auf die diese threads neu startet um neue berechnungen zu machen. ich hatte schonmal einen threads "1000 threads oder iterativ" - hoffe also dass ich hier jetzt nicht mit einem neuen thread alle störe.
das problem ist: ich will permanente vollauslastung aller kerne haben. liegt es wohl am join() dass sagen wir am ende 3 threads auf den langsamsten thread waren, somit die auslastung von 99-100% runtergeht, der letzte thread fertig wird, die schleife erneut aufgerufen wird, alle threads wieder arbeiten, die schnellsten 3 wieder auf den langsamsten warten, cpu auslastung wieder runtergeht usw. hab hier ne abart sinuskurvige auslastung meiner 4 kerne.
hier ein bild:
der rote kasten zeigt die erzeugung von den 4 threads, alle werden gestartet und um blauen kasten gejoined. auf der linken seite sieht man meine threadklasse.
was für möglichkeiten habe ich? als ich die abarbeitung der arraylist nicht in 4 bereiche aufgeteilt habe sondern für jedes element ein eigenen thread erstellt habe (hatte dann so 1000 threads) wars einfach DEUTLICH schneller als mit 4 threads.
wie ist die richtige vorgehensweise, ich muss auf alle berechnung jedes threads warten.
