Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ImageJ中的线程打开文件夹?(爪哇)_Java_Multithreading_Imagej - Fatal编程技术网

Java 如何使用ImageJ中的线程打开文件夹?(爪哇)

Java 如何使用ImageJ中的线程打开文件夹?(爪哇),java,multithreading,imagej,Java,Multithreading,Imagej,作为ImageJ插件项目的一部分,我需要打开多达3000个图像 图像堆栈。 用户选择一个包含所有文件的文件夹 DirectoryChooser dirChoos = new DirectoryChooser("Select Folder"); String filePath = dirChoos.getDirectory(); 我当前打开文件的方法是使用 FolderOpener opener = new FolderOpener(); ImagePlus imp = opener.openF

作为ImageJ插件项目的一部分,我需要打开多达3000个图像 图像堆栈。 用户选择一个包含所有文件的文件夹

DirectoryChooser dirChoos = new DirectoryChooser("Select Folder");
String filePath = dirChoos.getDirectory();
我当前打开文件的方法是使用

FolderOpener opener = new FolderOpener();
ImagePlus imp = opener.openFolder(filePath);
ImageStack stack = imp.getImageStack();
这是可行的,但是对于较大的文件夹,这会增加4到5分钟的插件运行时间。虽然我知道打开大文件夹显然需要更多的时间,但如果我能把它减少一点就好了

我尝试实现的方法是

File folder = new File(filePath);
String[] listOfFiles = Folder.list();
Arrays.sort(listOfFiles); // to make sure the stack is in the right order
通过使用Arrays.copyOfRange(为了参数起见,将其拆分为3)和部分,并将它们传递给一个扩展线程的对象来实现

openFolder r1 = new openFolder(listOfFiles_part1);
openFolder r2 = new openFolder(listOfFiles_part2);
openFolder r3 = new openFolder(listOfFiles_part3);

new Thread(r1).start();
new Thread(r2).start();
new Thread(r3).start();
openFolder的方法使用listOfFiles_部分从文件中形成ImagePlus实例数组

int len = Array.getLength(listOfFiles_part)
ImagePlus[] impArray = new ImagePlus[len];
for (int a = 0; a < len; a++ ) {
     impArray[a] = new ImagePlus((listOfFiles_part[a]).getPath());
}
int len=Array.getLength(listOfFiles\u部分)
ImagePlus[]impArray=新的ImagePlus[len];
对于(int a=0;a
然后,返回imparray,并从数组中形成ImageStack

然而,这看起来确实有点迟钝,到目前为止,我还没有太多的运气实现它

有没有更好的方法使用线程从文件夹中获取ImageStack? (使用线程是否一定会加快进程?)

任何帮助都将不胜感激。
干杯

方法不止一种。 如果您使用Java8,那么并行方法更简单

List<ImagePlus> impArray = new ArrayList<ImagePlus>();
listOfFiles_part.parallelStream()
.forEachOrdered(i -> impArray.add(new ImagePlus(i.getPath()));
List impArray=new ArrayList();
listOfFiles_part.parallelStream()
.forEachOrdered(i->impArray.add(newImagePlus(i.getPath()));

否则,您可能会使用threadpool,因为您不知道硬件的优化线程数。

有多种方法。 如果您使用Java8,那么并行方法更简单

List<ImagePlus> impArray = new ArrayList<ImagePlus>();
listOfFiles_part.parallelStream()
.forEachOrdered(i -> impArray.add(new ImagePlus(i.getPath()));
List impArray=new ArrayList();
listOfFiles_part.parallelStream()
.forEachOrdered(i->impArray.add(newImagePlus(i.getPath()));

否则,您可能会使用threadpool,因为您不知道硬件的优化线程数。

ImagePlus的瓶颈在哪里,排序或创建新实例?@Mr_Thorynque-瓶颈是创建ImagePlus的新实例。我的想法是,如果我使用多个线程创建ImagePlus实例,然后urn会更快,但我在多线程方面的经验有限,因此任何指针都会受到赞赏。ImagePlus排序或创建新实例的瓶颈在哪里?@Mr_Thorynque-瓶颈是创建ImagePlus的新实例。我的想法是,如果我使用多个线程创建ImagePlus实例并返回它会更快,但我在多线程方面的经验有限,所以任何指针都会受到欢迎。谢谢!这看起来绝对是一个更好的方法。谢谢!这看起来绝对是一个更好的方法。