Java 如何使用ImageJ中的线程打开文件夹?(爪哇)
作为ImageJ插件项目的一部分,我需要打开多达3000个图像 图像堆栈。 用户选择一个包含所有文件的文件夹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
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实例并返回它会更快,但我在多线程方面的经验有限,所以任何指针都会受到欢迎。谢谢!这看起来绝对是一个更好的方法。谢谢!这看起来绝对是一个更好的方法。