在Java中调整图像文件大小时最大化并发性

时间:2012-02-17 16:16:59

标签: java multithreading synchronization

假设我有一个需要调整某些图像文件大小的多线程应用程序。我不希望多个线程能够同时调整同一个图像并覆盖彼此的结果并破坏文件,但为了最大化并发性,我希望多个线程能够同时调整不同图像的大小。

线程获取特定图像锁定的最佳方法是什么,而不是简单地同步整个代码块?

2 个答案:

答案 0 :(得分:2)

  • 使用固定线程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)

  • 如果图像在内存中并且您有1个CPU,请仅使用 1个线程。由于没有阻塞等待或其他延迟,因此线程之间的上下文切换没有任何意义。
  • 如果您有n个CPU,则可以使用1个线程/ CPU。
  • 如果您的图像位于不同的驱动器上,例如RAID,您可以使用1个线程/驱动器并行加载它们,以及1个执行调整大小的线程。您可以使用生产者消费者范例。

编辑:刚看到对我的评论的回复
  - 由于图像是磁盘上的文件,因此使用 1个线程从磁盘读取图像 1个线程进行处理。假设调整图像大小不会花费更长的时间来寻找文件并加载它们。