Ich benutze den ForkJoinPool, um Aufgaben parallel auszuführen. Wenn ich mir den Logout-Befehl meines Programms ansehe, scheint es, dass der ForkJoinPool eine große Menge an Arbeitern erstellt, um meine Aufgaben auszuführen (es gibt Protokolleinträge, die wie folgt aussehen: 05 Apr 2016 11:39:18,678 [ForkJoinPool-2-worker-2493] <message>
).ForkJoinPool erstellt eine große Menge an Arbeitern
Gibt es für jede erstellte Aufgabe einen Arbeiter, der dann entsprechend der Anzahl der Parallelitäten ausgeführt wird, die ich im ForkJoinPool konfiguriert habe, oder mache ich etwas falsch? Hier ist, wie ich es tun:
public class MyClass {
private static final int NUM_CORES = Runtime.getRuntime().availableProcessors();
public MyClass() {
int maxThreads = NUM_CORES * 2;
this.forkJoinPool = new ForkJoinPool(maxThreads);
}
public void doStuff() {
final int[] toIndex = {0};
forkJoinPool.submit(() -> {
List<ForkJoinTask> tasks = new ArrayList<>();
while (toIndex[0] < objects.size()) {
toIndex[0] += 20;
List<Object> bucket = objects.subList(toIndex[0] - 20, toIndex[0]);
ForkJoinTask task = new UpdateAction(bucket);
tasks.add(task);
task.fork();
}
tasks.forEach(ForkJoinTask::join);
}).join();
}
private class UpdateAction extends RecursiveAction {
private List<Object> bucket;
private UpdateAction(List<Object> bucket) {
this.bucket = bucket;
}
@Override
protected void compute() {
// do some calculation
}
}
}
Blick in die Quelle (GrepCode) - die Nummer ist nur ein gemeinsamer Zähler, der unter allen ForkJoinPools geteilt wird und erhöht wird, wenn ein neuer Arbeiter erstellt wird. Es spiegelt in keiner Weise die Anzahl der Threads in Ihrem ForkJoinPool wider. – Fildor