Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..?

sirbender

Top Contributor
Hallo,

ich will eine langwierige Rechnung parallelisieren. Ich habe viel mit ExecutorService und den entsprechenden ThreadPools experimentiert. Aber so richtig bekomme ich damit nicht hin was ich will. Ich weiss vor allem nicht wie man den TreadPool sinnvoll steuert (aktive Threads schlafen legen usw.)

Ich habe mal ein kleines Codebeispiel geschrieben. Ich nutze int[] als Input und Integer als Resultat. Diese Datenstrukturen dienen nur als Beispiel.

Ich denke mit dem Codebeispiel wird klarer was ich vor habe:

Java:
package experiment;

import java.util.HashMap;
import java.util.Map;

public class ParallelHelperExample {

    public static void main(String[] args) {
        Map<String, int[]> dataMap = new HashMap<String, int[]>();
        dataMap.put("AcceleratorCollisionDataSet-2015-05-25", new int[] { 1, 2, 3 });
        dataMap.put("AcceleratorCollisionDataSet-2015-05-26", new int[] { 4, 5, 6 });
        dataMap.put("AcceleratorCollisionDataSet-2015-05-27", new int[] { 7, 8, 9 });
        // ... typischerweise 200 dataSets

        ParallelHelper helper = new ParallelHelper(dataMap) {
            @Override
            Integer calcResult(int[] data) {
                return 0; // die Berechnung ist extremst kompliziert und langwierig (Stunden)
            }
        };
       
        helper.start();
       
        // danach sporadische Aufrufe von helper.getResult(mapKey). Der Wert von 'mapKey' ist nicht vorhersagbar
        // und somti auch die Reihenfolge der Berechnung der Resultate nicht optimierbar 
    }
}

abstract class ParallelHelper {
    final Map<String, Integer> resultMap = new HashMap<String, Integer>();
   
    public ParallelHelper(Map<String, int[]> dataMap) {
        // nutzt eine Art Threadpool, z.B. via ExecutorService
    }
   
    void start() {
        // started die Berechnung fuer jedes key-value Paar in 'dataMap' ein Ergebnis via calcResult(...)
        // speichert das Ergebnis in 'resultMap'
    }
   
    // calcResult muss von Nutzer von ParallelHelper implementiert werden
    abstract Integer calcResult(int[] data);
   
    int getResult(String mapKey) {
        // schaut ob das Ergebnis fuer 'mapKey' bereits berechnet wurde
        // muss das Ergebnis noch berechnet werden, nutzt ParallelHelper nun 100% der Rechenleistung um das Ergbnis fuer 'mapKey' zu generieren
        // dazu muessen alle aktiven Threads im Pool die gerade Ergebnisse fuer andere 'mapKeys' berechnen 'schlafen gelegt' bzw. 'gestoppt' werden
        // Anmerkung: es waere gut, wenn ParallelHelper hier die bereits laufenden Berechnungen nur anhalten und spaeter wieder fortsetzen
        // koennte anstatt komplett stoppen und neu beginnen. Dies liegt daran, dass einzelne Berechnungen teilweise Stunden brauchen.
       
        // Sonderfall: der gesuchte mapKey wird bereits von einem der aktiven Threads berechnet.
        // In diesem Fall soll dieser eine Thread natuerlich weitermachen und nicht 'schlafen gelegt' werden ;)
       
        // wurde das gesuchte Ergebnis berechnet sollten die vorher 'schlafen gelegten' bzw. 'gestoppten' Threads
        // wieder automatisch weiterarbeiten bzw. 'neu gestartet' werden bis 'resultMap' vollstaendig gefuellt ist
       
        return 0; // das gesuchte Ergebnis wird zurueckgegeben
    }
}
 

Tom299

Bekanntes Mitglied
Also ich würde z.B. keine get-Methode benutzen, um einen Wert abzufragen. Ich würde mir ein Interface definieren mit z.B. public void calculationFinished(String key, int result). Das Interface jedem Thread z.B. im Konstruktor übergeben. Dein "ThreadManager" würde dann die Events abfangen und in die "ResultMap" reinschreiben. So mußt du nicht explizit einen Wert anfragen sondern bekommst ihn mitgeteilt, sobald der Wert berechnet wurde.

Deine getResult-Methode klingt für mich der Beschreibung nach eher nach sowas wie einem "force". Es sollte auch kein Problem sein, über eine Variable andere Threads zu pausieren, bis ein bestimmter Thread seine Arbeit erledigt hat. Z.B. könnte man jedem Thread einen Namen geben (z.B. der Key der Map) und um einen Thread zu forcieren kannst du in der run-methode abfragen, ob der Thread-Name paßt, ansonsten pausieren bzw. bei NULL laufen alle Threads weiter oder so in der Art.

Desweiteren kannst du bei einem Thread auch eine Priority setzen, um bestimmte Threads zu bevorzugen oder zu benachteiligen (MIN, MAX, von 1 - 10). Ob dir das was bringt, weiß ich nicht. Weiß auch nicht, ob man die Prio während der Thread läuft verändern kann. Müßte man mal ausprobieren.

Ich nutze selbst oft bei Threads oben genannte "Interface-Methode" bzw. "Listener-Prinzip" (funktioniert quasi wie die ActionListener usw.) und komme damit gut klar. Gibt aber sicherlich auch andere Möglichkeiten, deine Aufgabe zu lösen.
 

sirbender

Top Contributor
Danke fuer die Antwort.

Das explizite Wert-Abfragen MUSS aber moeglich sein. Es geht darum, dass der ThreadPool gestartet wird und im Hintergrund die Ergebnisse berechnet. Es kann sein, dass ein Ergebnis (mittels des mapKey) abgefragt wird. Dann soll wie ich in den Comments geschrieben habe der Parallelhelper-Threadpool alle anderen Berechnungen erstmal sein lassen und nur mit einem Thread das abgefragte Result berechnen. Ist er damit fertig und hat es zurueckgegeben, kann die Taetigkeit der anderen Threads fortgesetzt werden.

Der Knackpunkt ist halt das Pausieren der Threads, der Berechnen des Werts und das Fortsetzen der Threads. Und dann sollten halt auch die Sonderfaelle behandelt werden, naemlich, dass der Wert der angefordert wird gerade berechnet wird bzw. dass ein zweiter oder dritter Wert angefordert wird waehrend der erste angeforderte Wert noch nicht zurueckgegeben wurde. Das sollten den ParallelHelper alles nicht ueberfordern und zu Problemen fuehren.

Du schreibst von Variablen usw. mit denen man pausieren kann. Das weiss ich natuerlich alles aber in allen meinen Versuchen fuehrte das zu allen moeglichen Desastern und Problemen. Hier hoffe ich, dass mir jemand an einen minimalen, konkreten Beispielcode zeigen kann wie sowas narrensicher geht. Das Drumherum schaffe ich dann hoffentlich selbst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
AhmadSlack KANN MIR JEMAND HELFEN? Allgemeine Java-Themen 32
M Kann mir jemand helfen? Allgemeine Java-Themen 4
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
berserkerdq2 Kann jemand vereinfacht erklären was Maven ist? Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
Robert Zenz Will mir jemand erklaeren wofuer man Module wirklich braucht? Allgemeine Java-Themen 38
J Hat jemand Erfahrung mit OpenMeetings Allgemeine Java-Themen 4
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
S Intressante Benchmark-Ergebnisse mit Listen. Weiss jemand wie man diese erklaeren kann? Allgemeine Java-Themen 15
F Kennt jemand das Java WebService Tutorial der Uni Hannover? Allgemeine Java-Themen 2
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
X JDK installieren Weiß jemand, wie ich GCJ (WINDOWS) installieren und anwenden kann? Allgemeine Java-Themen 11
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
M Genaues Bugtracking - jemand einen Vorschlag? Allgemeine Java-Themen 14
ruutaiokwu AVLTree implements SortedMap - hat jemand sowas? Allgemeine Java-Themen 3
ARadauer Schon mal jemand für Ungarn CSV Datein geschreiben? Allgemeine Java-Themen 2
G Kennt jemand gute Produkte zum Lizensieren der eigenen Apps? Allgemeine Java-Themen 6
J ServiceInterface - Runtime() > jemand eine idee? Allgemeine Java-Themen 2
M kennt jemand nen gute email client in java mit imap? Allgemeine Java-Themen 3
S kennt jemand Java Map? Allgemeine Java-Themen 5
B Suche jemand mit jre/jdk 1.4 oder älter Allgemeine Java-Themen 8
F Installer für Windows schreiben! Hat jemand ein Beispiel? Allgemeine Java-Themen 8
Ullenboom Ein neues Java-Buch entsteht, willst du helfen? Allgemeine Java-Themen 7
I Studium - bitte dringend helfen !!! Allgemeine Java-Themen 17
E XDEV als OpenSource - Wer kann mir helfen? Allgemeine Java-Themen 11
C Eclipse spinnt - bitte Helfen! Allgemeine Java-Themen 3
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
G Totales chaos. Wer kann helfen! Allgemeine Java-Themen 2
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben