Java JAI.create()可以在多个线程中使用吗?

Java JAI.create()可以在多个线程中使用吗?,java,multithreading,image-processing,jai,Java,Multithreading,Image Processing,Jai,我正在基于开源软件JPiv构建一个程序,用于数字图像相关和应变分析。不幸的是,JPiv中的算法非常慢,所以我一直在尝试使用多线程来减少分析图像集所需的时间。该算法使用JAI来表示某些内容,但不太确定是什么,因为我以前从未使用过它。当我运行它时,在第二次“通过”时,我在至少一个线程上得到一个OutOfMemory异常,并且偶尔会得到其他错误,看起来是随机的,但通常是非法的争论异常——有时来自JAI,有时来自标准Java库。异常在程序中的不同点被不同的库抛出,这使得调试变得很困难,特别是由于某些原因

我正在基于开源软件JPiv构建一个程序,用于数字图像相关和应变分析。不幸的是,JPiv中的算法非常慢,所以我一直在尝试使用多线程来减少分析图像集所需的时间。该算法使用JAI来表示某些内容,但不太确定是什么,因为我以前从未使用过它。当我运行它时,在第二次“通过”时,我在至少一个线程上得到一个OutOfMemory异常,并且偶尔会得到其他错误,看起来是随机的,但通常是非法的争论异常——有时来自JAI,有时来自标准Java库。异常在程序中的不同点被不同的库抛出,这使得调试变得很困难,特别是由于某些原因,它们并不总是在控制台中给出回溯消息

我认为错误在于使用JAI.create()方法,以及不同线程访问corr[c]变量以使用上述方法的方式。是否可以按照我尝试的方式使用JAI.create()

代码相当长,因此我将其放在这里的Pastebin上:

下面是一段伪代码,以大致了解我正在尝试的内容

public doPivEvaluation{
corr = new BufferedImage
start threads
send corr array to threads
loop until threads have finished
do stuff with corr}

public class threads{
on start{
    do the analysis using tmpCorr
    pb = new ParameterBlock()

    pb.removeSources();
    pb.removeParameters();
    pb.addSource(PivEvaluation.corr[c]);
    pb.addSource(tmpCorr);
    PivEvaluation.corr[c] = JAI.create("add",pb,null).getAsBufferedImage();

end threads}
嗯,是的,也许不是最好的伪代码,但是是的。corr,c中的位置对于每个线程都是不同的(并且是指一组像素,因此根据图像的大小,可以高达5000,在不同线程之间分割),并且corr已声明为volatile,因此理论上不应该重写数据。同样,理论上,如果JAI.create()只作用于该位置,也应该没有问题。出现这个问题是因为我不明白.create()实际上是如何工作的。。。我知道整个过程在一个线程中运行,因为我没有改变任何实际算法,只是将其移动到多个线程中

另外,对于代码中可能出现的任何糟糕的编码实践,我深表歉意,因为我对Java还是比较陌生的,所以我更喜欢混日子。如果我尝试了一些东西,它解决了一个问题,我很可能会使用它,即使它意味着多个变量声明或其他任何我所做的低效。这是我遇到的第一个无法通过猜测和谷歌解决的问题