Максимальный параллелизм при изменении размера файлов изображений в Java - PullRequest
0 голосов
/ 17 февраля 2012

Допустим, у меня есть многопоточное приложение, которому нужно изменить размер некоторых файлов изображений. Я не хочу, чтобы несколько потоков могли изменять размер одного и того же изображения в одно и то же время и перезаписывать результаты друг друга и повреждать файл, но для обеспечения максимального параллелизма я хочу, чтобы несколько потоков могли изменять размер разных изображений одновременно.

Каков наилучший подход для потока, чтобы получить блокировку для определенного изображения, а не просто синхронизировать целый блок кода?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012
  • Использовать фиксированный поток 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
    
0 голосов
/ 17 февраля 2012
  • Если изображения находятся в памяти и у вас 1 процессор, используйте только 1 поток .Нет смысла в переключении контекста между потоками, поскольку нет заблокированных ожиданий или других задержек.
  • Если у вас n процессоров, вы можете использовать 1 поток / процессор.
  • Если ваши образы расположены на разных дисках, например RAID, вы можете использовать 1 поток / диск для их загрузки впараллельно, и 1 поток, который делает изменение размера.Вы можете использовать потребительскую парадигму производителя.

РЕДАКТИРОВАТЬ: только что увидел ответ на мой комментарий
- Поскольку изображения представляют собой файлы на диске, для чтения используйте поток 1с диска образы и 1 поток для обработки .При условии, что изменение размера изображения не займет больше времени, чем задержка жесткого диска, для поиска файлов и их загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...