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,
und hier steh ich irgendwie grad auf dem schlauch:
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
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: