假设我有一个需要调整一些图像文件大小的多线程应用程序。我不希望多个线程能够同时调整相同的图像并覆盖其他人的结果并损坏文件,但为了最大化并发性,我希望多个线程能够同时调整不同图像的大小。在Java中调整图像文件大小时最大化并发性
线程获取特定映像上的锁而不是简单地同步整个代码块的最佳方法是什么?
假设我有一个需要调整一些图像文件大小的多线程应用程序。我不希望多个线程能够同时调整相同的图像并覆盖其他人的结果并损坏文件,但为了最大化并发性,我希望多个线程能够同时调整不同图像的大小。在Java中调整图像文件大小时最大化并发性
线程获取特定映像上的锁而不是简单地同步整个代码块的最佳方法是什么?
使用固定线程ExecutorService
并有一个线程将所有图像提交到要处理的服务中。只要你不提交相同的图像两次,你不会有问题。
你也可以有一个线程,为其他线程使用“todo”BlockingQueue
。那么你有一个线程可以控制线程工作的图像,所以不需要锁。
另一种方法是使用ConcurrentHashMap
,并让每个线程putIfAbsent
然后只有在它工作时才使用图像。
if (concurrentMap.putIfAbsent(imagePath, null) == null) {
// do the processing
// either remove it from map when done or leave it to stop future processing
}
// I guess loop around and look at the next image
编辑:刚才看到的回复我的评论
- 因为图像是磁盘上的文件使用1线从磁盘中读取图像和1线程处理。假设调整图像大小不会花费比HDD延迟更长的时间来查找文件并加载它们。
它很模糊您在此处的“图像”的含义。文件?堆中的图像实例? – Durandal 2012-02-17 16:19:47
我猜他的意思是堆 – Adrian 2012-02-17 16:23:35
我的意思是文件,最终我不希望线程A在A完成并损坏文件之前覆盖线程B的结果。我会修改这个问题。 – 3urdoch 2012-02-17 16:31:26