ForkJoinPool を介して大量の画像を読み込む際に問題が発生しています。ハイパースヘディングを使用して 4 コアの Intel でテストしているため、8 つの論理スレッドがあります。ただし、プールを 4 スレッドのみに制限します。また、ImageIO で画像が見つからないというエラーが表示されます。
public class LoadImages extends RecursiveAction {
private static final long serialVersionUID = 1L;
//this is an example
private static int threadThreshold = totalImages/totalThreads + 2;
private String[] imgArr;
private int arrStart = 0;
private int arrSize = 0;
public LoadImages(String[] imgs, int start, int size) {
imgArr = imgs;
arrSize = size;
arrStart = start;
}
protected void processImages(){
BufferedImage img = null;
for (int i = arrStart; i < arrStart + arrSize; i++) {
try{
img = ImageIO.read(new File(imgArr[i]));
} catch (IOException | CMMException | NullPointerException e) {
System.out.println(imgArr[i]);
e.printStackTrace();
img = null;
}
...
}
}
protected void compute() {
// Check the number of files
if (arrSize <= threadThreshold) {
processImages();
return;
} else {
int split = arrSize / 2;
invokeAll(new LoadImages(imgArr, arrStart, split), new LoadImages(imgArr, arrStart + split, arrSize - split));
}
}
}
私が間違っていることについての洞察は素晴らしいでしょう.1700以上の画像があり、すべての画像が5MB以上の場合にのみ壊れることに気付きました.
Javaから受け取ったエラーは次のとおりです。
javax.imageio.IIOException: Can't create an ImageInputStream!
at javax.imageio.ImageIO.read(Unknown Source)
ファイルがそこにあることを知っているとき。このコードをガイドとして使用しました: https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html