Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..?

sirbender

Top Contributor
Hallo,

ich will Daten beim Programm-Start in einem extra Thread bzw. mit einem Threadpool mit geringer Prioritaet (d.h. andere Prozesse sollen nicht verlangsamt werden - vor allem nicht die UI) im Hintergrund laden.
Ich koennte die Daten auch just-in-time generieren, aber dann muesste der Nutzer mitunter unnoetig lange darauf warten.

Die Daten sollen in einer Map<String, T_DatenKlasse> abgelegt werden. Generics ausdruecklich moeglich.

Am liebsten haette ich eine abstrakte Klasse ParallellHelper die die ganzen Details wegkapselt. Man selbst erweitert dann lediglich die Klasse ParallellHelper und implementiert Methoden die z.B. die Daten generieren und man bekommt zugriff auf die Daten via get(String key), welche die T_DatenKlasse-Objekte aus der Map holt.

Um das ganze zu starten instanziert man seine ParallellHelper-Klasse und ruft einmalig .start() auf.

!!! ABER !!!

Die Klasse ParallellHelper sollte vor allem wegkapseln, dass man den Fall hat, dass der Pool gerade die Daten erzeugt, waehrend der Nutzer Daten per get(Key) abrufen will. Dann sollte ParallellHelper CLEVER sein und alle Arbeit liegen lassen und das mittels "Key" geforderte Objekt generieren!
Eventuell wurschtelt ParallellHelper ja auch gerade an dem gesuchten Objekt. Dann sollten alle Threads bis auf den der gerade das gesuchte Objekt generiert nix tun damit sie nicht die Objekt-Generierung verlangsamen.
Ist das Objekt "ausgeliefert" sollte die Objektgenerierung wieder wie gewohnt fortfahren.

Hat jemand von euch Erfahrung oder Vorschlaege wie man sowas macht? Eventuell vielleicht schon eine Klasse die etwas sehr Aehnliches macht?

vielen Dank,
sb
 
Fork/Join klingt ja intressant. Scheint sogar performanter zu sein als normale Threadpools. Komisch. Wie das wohl kommt...intern laeuft doch bestimmt ein Threadpool.

Leider gibt es Fork/Join halt nur mit den neueren JDKs und dann halt nicht fuer Android und Co.
 
Zuletzt bearbeitet:
Puhhh...irgendwie funktionieren alle Sachen die ich ausprobiere nicht wirklich. Mangels Erfahrung befuerchte ich. Gibt es da nichts fertiges, dass macht was ich will?
 
Eigentlich klingt das Ganze nach einer einfachen Operationqueue. Da hängst du für jeden Datensatz eine Oparation rein und läßt nur soviele parrallel ablaufen wie es Sinn macht (Wieviel das ist hängt davon ab was die Engstelle ist. Also z.B. Netzwerkgeschwindigkeit, Anzahl Kerne etc je nachdem was eben aufhält) Wenn nun ein spezieller Request kommt, hängst Du den ganz vorne in die Liste statt wie die anderen ans Ende. Wenn er schon in der Liste ist, schiebst du ihn nach vorne etc.

Gruß

Claus
 
Eigentlich klingt das Ganze nach einer einfachen Operationqueue. Da hängst du für jeden Datensatz eine Oparation rein und läßt nur soviele parrallel ablaufen wie es Sinn macht (Wieviel das ist hängt davon ab was die Engstelle ist. Also z.B. Netzwerkgeschwindigkeit, Anzahl Kerne etc je nachdem was eben aufhält) Wenn nun ein spezieller Request kommt, hängst Du den ganz vorne in die Liste statt wie die anderen ans Ende. Wenn er schon in der Liste ist, schiebst du ihn nach vorne etc.

Gruß

Claus

CPU ist die Engstelle. Optimalerweise sollten alle Kerne voll ausgelastet sein.

Was ich nicht verstehe, wenn die Queue voll ausgelastet ist - sagen wir 8 Objekte werden gerade berechnet (8 aktive Threads), dann sollten diese Objekte-Generierung erstmal auf Eis gelegt werden wenn ein anderes Objekt benoetigt wird. Sonderfall: das benoetigte Objekt wird gerade generiert. Also sollen nur 7 auf Eis gelegt werden. Wird das gesuchte Objekt zurueckgegeben, sollen die anderen 7-8 Objekte/Threads wieder busy werden.

Wie mach ich das alles? Wenn es so einfach Out-of-the-Box gehen wuerde, gaebe es doch massig Code fuer genau mein Problemfall per Google-Suche, oder?

Habe ich falsch gesucht?
 
Hat ja keiner ghesagt das es das fertig gibt. Ich habe sowas halt nur schon öfter in iOS umgesetzt. In Java brauchte ich das bisher noch nicht.

Wie lange dauert denn so ein Prozess dass du da einen abbrechen must wenn ein bestimmter gebraucht wird? Ich meine wenn ein Prozess mehrere Sekunden dauert, dann würde es vielleicht sinn machen die Prozesse noch einmal zu splitten? Andererseits eine Operation zu killen ist jetzt auch nicht das Problem.

Gruß

Claus
 
Naja, ich habe nicht gesagt, dass der "Prozess" der gerade rechnet abgebrochen werden soll. Ich sagte "schlafen gelegt". Er soll halt keine CPU-Zyklen verbrauchen.

Ich bin mir auch nicht sicher ob du genau was ich beschreibe schon mal in iOS gemacht hast. Denn es ist nicht einfach ein ThreadPool via ExecutorService oder so. Das ist schon ein bissl mehr Intelligenz dahinter.
 

Zurück
Oben