Ich versuche ein Bild mit einem ForkJoinPool in Java zu verarbeiten. Ich habe Streams verwendet, um einige benutzerdefinierte Operationen auf dem Bild auszuführen. Ich versuche, ForkJoinPool für getRGB
und setRGB
Methoden zu verwenden. Wie erreiche ich Parallelität auf getRGB
Methoden?ForkJoinPool BufferedImage Verarbeitungsstil
@Override
public int[] getRGB(int xStart, int yStart, int w, int h, int[] rgbArray,int offset, int scansize) {
int[][] sol = new int[h][w];
int threshold = w;
class RecursiveSetter extends RecursiveAction {
int from;
int to;
FJBufferedImage image;
RecursiveSetter(int from, int to, FJBufferedImage image) {
this.from = from;
this.to = to;
this.image = image;
}
@Override
protected void compute() {
System.out.println("From : " + from + " To : " + to);
if (from >= to) return;
if (to - from == 1) {
computeDirectly(from);
return;
} else {
int mid = from + (to - from)/2;
System.out.println("From : " + from + " To : " + to +
"Mid :" + mid);
invokeAll(
new RecursiveSetter(from, mid, image),
new RecursiveSetter(mid + 1, to, image));
return;
}
}
void computeDirectly(int row) {
sol[from] = image.getRealRGB(from, 0, w, 1, null, offset,
scansize);
}
}
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
pool.invoke(new RecursiveSetter(0, h-1, this));
return Arrays.stream(sol)
.flatMapToInt(Arrays::stream)
.toArray();
}
Die getRealRGB
Proxys nur auf das Verfahren von BufferedImage
. Ich verstehe, dass dies möglicherweise unpraktisch ist, aber ich möchte nur wissen, wie kann ich ForkJoinPool in diesem Zusammenhang verwenden. Und ja, der obige Code wirft ArrayIndexOutOfBound
Exception. Bitte geben Sie einen Vorschlag, wie Sie die Arbeitsbelastung aufteilen (Reihe vs Spalte gegen kleines Gitter. Im Moment mache ich das spaltenweise) und wie man den Schwellenwert entscheidet.