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
 

sirbender

Top Contributor
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:

sirbender

Top Contributor
Puhhh...irgendwie funktionieren alle Sachen die ich ausprobiere nicht wirklich. Mangels Erfahrung befuerchte ich. Gibt es da nichts fertiges, dass macht was ich will?
 

Thallius

Top Contributor
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
 

sirbender

Top Contributor
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?
 

Thallius

Top Contributor
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
 

sirbender

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
I Allgemeine Herangehensweise bei Übernahme Allgemeine Java-Themen 19
J Erste Schritte Applet allgemeine Funkion Allgemeine Java-Themen 8
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S allgemeine Datenbankschnittstelle für Webservice Allgemeine Java-Themen 72
M allgemeine frage zur plattformunabhängigkeit Allgemeine Java-Themen 2
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
D Allgemeine Fragen zum Speichern Allgemeine Java-Themen 3
F allgemeine Fragen zu Java Allgemeine Java-Themen 9
M allgemeine Architekturfrage Allgemeine Java-Themen 4
J Ganz allgemeine Frage Allgemeine Java-Themen 3
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben