Я пытаюсь параллельно написать изображение, которое изменяется при каждой итерации цикла. Код выглядит так:

ExecutorService pool = Executors.newFixedThreadPool(8);
for (int i = array.length - 1; i > 0; i--) 
{
            pool.execute(() -> {
                ImageIO.write(bufferedImage, "JPG", fileName + i);
            });
            //Operations on the image...
}

Проблема в том, что изображение записывается только в его начальном состоянии (i=array.length) и в его конечном (i =1), но на самом деле записывает количество файлов, которое должно (array.length умножить). Итак, мой вопрос: нужно ли мне синхронизировать что-то в изображении, которое я пишу? Разве состояние объектов не фиксируется и не сохраняется в памяти после того, как задача попадает в очередь? Или задачи получают состояние объекта в во время их фактического выполнения?

0
Mattia Monari 1 Окт 2022 в 20:07
Почему if(i % delay == 0)?
 – 
Basil Bourque
1 Окт 2022 в 20:44
Вы не объяснили array и другие детали. Голосование закрывается из-за отсутствия подробностей.
 – 
Basil Bourque
1 Окт 2022 в 20:50
Я удалил i % delay, чтобы избежать путаницы. Для вопроса не важно знать, какие операции и сколько раз выполняется цикл. @talex действительно ответил на мой вопрос
 – 
Mattia Monari
2 Окт 2022 в 10:37

2 ответа

Лучший ответ

Задача получает состояние в момент выполнения.

В java нет простого способа получить снимок объекта.

1
talex 1 Окт 2022 в 21:32
Спасибо @talex. Знаете ли вы, существует ли реализация Runnable, которая получает состояние объекта в момент его планирования?
 – 
Mattia Monari
2 Окт 2022 в 10:41

Вы меняете изображение до того, как каждый Runnable получит возможность сохранить состояние изображения во время настройки подзадачи. Чтобы избежать этой проблемы, вы можете сделать копию образа перед настройкой каждого исполняемого файла следующим образом:

BufferedImage imageCopy = copyImage(bufferedImage);
pool.execute(() -> {
    ImageIO.write(imageCopy, "JPG", fileName + i);
});

См. эти ответы для возможных реализаций copyImage(BufferedImage) и условий/ограничений: Клонировать изображение Как клонировать изображение

0
DuncG 2 Окт 2022 в 14:13