我编写了一个处理图像的应用程序。我的操作代码应应用于文件夹中的所有图像(每个文件夹最多 100 万张)。
到目前为止,我为文件夹中的每个图像创建了一个Callable
(这是一个操作图像的工作器)并将其添加到一个ArrayList
。然后我使用 FixedThreadPool
的 invokeAll
方法来并行化工作。
但是,我的问题是:这是好的设计吗?我有些怀疑首先向数组列表添加 100 万个元素是否真的有意义。我正在考虑将 iterator
(通过文件)传递给所有线程并让每个线程获取下一个元素并处理它(不幸的是,当然有阻塞问题) - 但这样做有道理吗?
最佳答案
我听起来不错,即使它不一定非常有效并且扩展性不是很好。另一种设计可能是:
- 创建一个
ArrayBlockingQueue<File>
比你的 FixedThreadPool 大(比方说大两倍) - 创建一个
FileVisitor
,我们称它为ImageFileVisitor
, 在visitFile
方法puts
队列中的已访问文件 - 这是一个阻塞调用,因此它将一直等到队列未满 - 创造尽可能多的
Callable
s 作为你的池的大小并使它们中的每一个take
从队列中取出并做他们必须做的事情
注意:线程池的大小应该相当小。如果您的图像处理非常繁重,则使用处理器的数量作为大小,如果它有些微不足道并且大部分时间花在读/写文件上,则使用较小的大小。
关于Java:创建大量 Callable 或将迭代器结果分发给线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16896402/