Fork Join bei Arraylist

vimar

Bekanntes Mitglied
Hallo,


ich hab eine Arraylist mit 1000 Objekten und will diese auf 4 Threads/Tasks verteilen (quadcore).


vorher hab ich mit 4 normalen threads gearbeitet, muss aber wegen join() immer auf den langsamsten thread warten (arraylist in 4 gleichgroße teile aufgeteilt und jedem thread 1/4 der arraylist gegeben).
ich brauche join weil ich am ende wissen will ob es eine veränderung gab. problem hierbei: 3 von 4 kernen idlen am schluss der berechnung und warten auf den letzten thread. so wie ich join fork verstanden habe, gibts hier einen work-stealing algo, also wenn ein thread fertig ist mit 1/4 seiner zugewiesenen arraylist, dass er sich dann objekte aus den noch nicht abgearbeiteten objekten der anderen 3 threads nimmt. ich denke also dass ich so effizient fast ohne idle time eines kerns schneller zum ergebnis komme. habe ich das richtig verstanden?

nun kam ich zu fork join,

Java:
static int numberOfProcessors = Runtime.getRuntime().availableProcessors(); // = 4
public static ForkJoinPool fjPool = new ForkJoinPool(numberOfProcessors);


und hier steh ich irgendwie grad auf dem schlauch:

Java:
class MyTask extends RecursiveTask<Boolean> {

    static final int SEQUENTIAL_THRESHOLD = 1000;
    ArrayList <cluster> cl;
    int firstcluster; // range lowest
    int lastcluster; // range highest
    
    MyTask(ArrayList <cluster> cl, int firstcluster, int lastcluster){
        this.cl = cl;
        this.firstcluster = firstcluster;
        this.lastcluster = lastcluster;
    }
    
    @Override
    protected Boolean compute() {
     
        
        
        
        return false;
    }
    
}



ich muss doch garnicht mehr "threads" erstellen (new thread..)? inwiefern splitte ich die arraylist nun auf? macht forkjoin da alles automatisch? was müsste ich denn tendenziell schreiben?

ich möchte einen boolean als rückgabewert der gesamten arraylistabarbeitung, daher -> boolean compute(). ich schreibe in meinen berechnungen weder in die arraylist noch remove ich elemente. ich will lediglich objekte auslesen.

mfg vimar
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das work-stealing bezieht sich auf Tasks bzw. sub-tasks. Die Threads werden automatisch erstellt. Gibt's eine konkretere Frage dazu?
 

vimar

Bekanntes Mitglied
ja gibt einen grund. geht darum dass jeder thread einen gewissen booleanwert verändern kann bei einem objekt von false auf true.

am ende wenn alle threads fertig sind schaue ich nach ob dieser boolean auf true geändert wurde. daher muss ich auch auf den letzten thread warten.
 

Marco13

Top Contributor
Huiui ... klingt gefährlich, wenn "viele" Threads schreibend auf was zugreifen... naja, wenn's nur eine boolean-Variable ist, könnte es OK sein (zumindest volatile sollte sie dann aber sein... ggf. auch irgendwas mti syncrhonized drumrum...)
 

vimar

Bekanntes Mitglied
ich weiss auch nicht warum das so schwer fällt hier... einfach ne arraylist statt sequentiell auslesen einfach mit 4 threads.. unbegreiflich dass man da so lange dran werkeln muss
 

Marco13

Top Contributor
Wenn du schon weißt, dass es nur 4 Threads sein sollen, und es keine hierarchisch zerlegbare Aufgabe ist, warum dann mit einem ForkJoinPool? Bei einer List würde sich das eigentlich vielleicht anbieten, da könnte man sicher was geschickt mit subList machen, aber wie man das machen könnte, ... dazu müßte ich mir den ForkJoinPool nochmal genauer ansehen.

Ist das Work-Stealing wichtig? Beschreib' doch mal genauer, worum es eigentlich geht. Wenn's nur darum geht, alle 4 cores eine Zeitlang beschäftigt zu halten: Für sowas verwende ich immer so ein Muster wie
Java:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class ParallelExecutionSample
{
    public static void main(String[] args)
    {
        List<String> list = new ArrayList<String>();
        for (int i=0; i<100000; i++)
        {
            list.add(String.valueOf(i));
        }

        ParallelExecutionSample sample = new ParallelExecutionSample();
        sample.execute(list);
    }
    
    private final ExecutorService executorService;
    private final int numProcessors;
    
    ParallelExecutionSample()
    {
        numProcessors = Runtime.getRuntime().availableProcessors();
        executorService = Executors.newFixedThreadPool(numProcessors);
    }

    public void execute(final List<?> list)
    {
        int batchSize = (int)Math.ceil((double)list.size() / numProcessors);
        List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
        for (int i=0; i<numProcessors; i++)
        {
            final int minIndex = i * batchSize;
            final int maxIndex = Math.min(list.size(), minIndex + batchSize);
            Callable<Void> callable = new Callable<Void>()
            {
                @Override
                public Void call() throws Exception
                {
                    execute(list, minIndex, maxIndex);
                    return null;
                }
            };
            tasks.add(callable);
        }
        try
        {
            executorService.invokeAll(tasks);
        }
        catch (InterruptedException e)
        {
            Thread.currentThread().interrupt();
        }
    }
    
    private void execute(List<?> list, int minIndex, int maxIndex)
    {
        System.out.println("Execute something in the range "+minIndex+" to "+maxIndex);
        double dummy = 0;
        for (int i=minIndex; i<maxIndex; i++)
        {
            double v = list.get(i).hashCode();
            for (int j=0; j<100; j++)
            {
                dummy += Math.cos(Math.sin(Math.tan(v)));
                dummy *= Math.cos(Math.sin(Math.tan(v)));
                dummy /= Math.cos(Math.sin(Math.tan(v)));
            }
        }
        System.out.println("Result "+dummy);
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Programm soll im Hintergrund laufen (vgl. fork() bei C) Allgemeine Java-Themen 10
A join."," von python in java Allgemeine Java-Themen 3
A eine test thread.join() frage Allgemeine Java-Themen 2
Luk10 Multi-Threading mit join() Allgemeine Java-Themen 16
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
T Frage zu Join bei Threads Allgemeine Java-Themen 3
M ArrayList oder LinkedList Allgemeine Java-Themen 10
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
R ArrayList Allgemeine Java-Themen 4
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
L ArrayList sortieren Allgemeine Java-Themen 2
C ArrayList Problem Allgemeine Java-Themen 3
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
S Best Practices CopyConstrutor mit ArrayList Allgemeine Java-Themen 1
S ArrayList Design Allgemeine Java-Themen 4
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
X Adjazenzliste ohne ArrayList Allgemeine Java-Themen 6
X Output von ArrayList Allgemeine Java-Themen 3
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
H Arraylist mit anderer ArrayList überschreiben Allgemeine Java-Themen 17
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
D ArrayList Indexlänge ändern Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Mehrdimensionale ArrayList mischen Allgemeine Java-Themen 10
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
MiMa Date aus einer ArrayList<Date> holen ?? Allgemeine Java-Themen 5
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
GreenTeaYT Verständnisprobleme zur Arraylist Allgemeine Java-Themen 1
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
K ArrayList sortieren Allgemeine Java-Themen 16
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
S Mehrdimensionales ArrayList ins HashSet Allgemeine Java-Themen 10
C ArrayList Allgemeine Java-Themen 8
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
K Array in ArrayList Allgemeine Java-Themen 16
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
Paul15 Arraylist 2D Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
Neumi5694 Datentypen ArrayList vs TreeMap Allgemeine Java-Themen 6
F ArrayList Allgemeine Java-Themen 11
X ArrayList will nicht so wie ich will. Hilfe Allgemeine Java-Themen 8
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
R ArrayList und HashMap Allgemeine Java-Themen 7
T ArrayList zeilenumbruch entfernen Allgemeine Java-Themen 13
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
Doopy ArrayList plötzlich leer Allgemeine Java-Themen 2
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
L ArrayList Inhaltstyp. Allgemeine Java-Themen 5
Z Klassen ArrayList selbst machen Allgemeine Java-Themen 5
J Arraylist speichern und laden? Allgemeine Java-Themen 5
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
M ArrayList<String> Frage Allgemeine Java-Themen 7
O ArrayList kaputt?! Allgemeine Java-Themen 5
M ArrayList<Foo> in ein Foo[] konvertieren? Allgemeine Java-Themen 8
Bananabert Abstract ArrayList Allgemeine Java-Themen 4
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
O ArrayList - Serialisierungs-Problem Allgemeine Java-Themen 11
M JTable + ArrayList Allgemeine Java-Themen 3
M Datentypen ArrayList in Integer konvertieren Allgemeine Java-Themen 3
O Collections ListIterator gibt Inhalt von ArrayList nicht aus Allgemeine Java-Themen 3
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
M Kovariante Rückgabewerte mit ArrayList Allgemeine Java-Themen 3
H LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ? Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
Maxim6394 Problem mit ArrayList Allgemeine Java-Themen 5
E Berechnung in Arraylist Allgemeine Java-Themen 10
E ArrayList mit unbekannter Größe Allgemeine Java-Themen 8
H Fehler in Arraylist Allgemeine Java-Themen 2
S Datensätze in eine ArrayList<Movie> speichern Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben