Java:创建大量 Callable 或将迭代器结果分发给线程?

标签 java parallel-processing

我编写了一个处理图像的应用程序。我的操作代码应应用于文件夹中的所有图像(每个文件夹最多 100 万张)。

到目前为止,我为文件夹中的每个图像创建了一个Callable(这是一个操作图像的工作器)并将其添加到一个ArrayList。然后我使用 FixedThreadPoolinvokeAll 方法来并行化工作。

但是,我的问题是:这是好的设计吗?我有些怀疑首先向数组列表添加 100 万个元素是否真的有意义。我正在考虑将 iterator (通过文件)传递给所有线程并让每个线程获取下一个元素并处理它(不幸的是,当然有阻塞问题) - 但这样做有道理吗?

最佳答案

我听起来不错,即使它不一定非常有效并且扩展性不是很好。另一种设计可能是:

  • 创建一个 ArrayBlockingQueue<File>比你的 FixedThreadPool 大(比方说大两倍)
  • 创建一个 FileVisitor ,我们称它为ImageFileVisitor , 在visitFile方法 puts队列中的已访问文件 - 这是一个阻塞调用,因此它将一直等到队列未满
  • 创造尽可能多的Callable s 作为你的池的大小并使它们中的每一个take从队列中取出并做他们必须做的事情

注意:线程池的大小应该相当小。如果您的图像处理非常繁重,则使用处理器的数量作为大小,如果它有些微不足道并且大部分时间花在读/写文件上,则使用较小的大小。

关于Java:创建大量 Callable 或将迭代器结果分发给线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16896402/

相关文章:

java - Spring Data Rest Repository 不会公开删除

可以有超过 1 个进程使用 MPI_Scatter 吗?

python - 使用 Numba 在 nd-array 上并行化最大值

java - java中的sysLoader.getResource()问题

java - BufferedReader 与 BufferedInputStream 的性能衡量

c# - 默认情况下,plinq 会对 Dictionary<string, string> 使用范围分区还是 block 分区?以及如何强制对方?

amazon-web-services - 是否将AWS Lambda视为并行处理?

java - 如何使用多线程并行运行两个类?

java - JTextPane 中文本颜色更改不准确

java - Spring Data JPA 查询返回 null