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

时间:2015-07-04 19:08:07

标签: java multithreading imagej

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

所有文件的文件夹
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将其分割为listOfFiles(为参数'而将其分成3)并将其分成几部分并将它们传递给扩展Thread的对象

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_part从文件中形成一个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());
}

然后,返回impArrays,并从数组中形成ImageStack。

然而,这似乎有点像一种迟钝的方法,而且我现在还没有太多运气。

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

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

1 个答案:

答案 0 :(得分:0)

还有一种方法。 如果使用java 8,则并行方法更简单

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

否则您可能使用了线程池,因为您根据硬件不知道优化的线程数。