Вернуть поток в начальное положение

185
12 января 2022, 23:40

Реализован конвейер, состоящий из Manager, Reader, Executor1, Executor2, Writer, наследованные от Runnable (Executor1 дергает Reader, получает от него данные, обрабатывает, затем Executor2 дергает Executor1, получает данные, обрабатывает и так далее).

Manager ставит объекты на конвейер в нужном порядке, затем запускает Reader.run(), который читает входной файл по кусочкам x байт и отдает его на обработку конвейеру.

Необходимо в менеджере создать n потоков Thread(Executor1), которые запустит Reader, отдав каждому потоку x/n байт данных на обработку, которые в порядке очереди примет Writerи запишет в выходной поток.

Проблема в том, что после первой итерации созданные потоки закрываются после Writer, а нужно обработать целый файл. Как решить задачу, не создавая новые потоки, кроме тех n, которые в начале построения конвейера создал менеджер? Можно ли как-то возвращаться после записи в начало потока? Или кидать в поток новые данные еще до того, как старые успеют дойти до райтера и закончить запись (неясно как это реализовать)?

Код без тредов можно посмотреть тут или тут.

Answer 1

Если я правильно понял, вы хотите выполнять какую-то логику в разных потоках над данными которые берете из одного файла и записывать результат обработки в другой файл.

Могу посоветовать сделать один поток - читатель файла - его задача, считывать данные и записывать куски в некую очередь допустим preQueu.

Несколько потоков обработки - мониторят данные в очереди preQueu, если она не пустая берут кусок на обработку и результат записывает в другую очередь postQueu, если preQueu пустая - поток засыпает на некоторое время, после чего опять проверяет очередь preQueu и так в бесконечном цикле, пока менеджер не остановит поток.

Поток записи в файл - в бесконечном цикле (пока не остановит менеджер) мониторит очередь postQueu, если данные есть - записывает их в файл, если данных нет, то засыпает на некоторое время, после чего опять делает проверку.

Смущает только одна фраза:

которые в порядке очереди примет Writer

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

READ ALSO
Как вывести все элементы двумерного массива с помощью foreach?

Как вывести все элементы двумерного массива с помощью foreach?

Не могу понять, как вывести двумерный массив с помощью foreach на языке java

139
Построить круг из точек

Построить круг из точек

Всем привет! Нужно построить круг из точек( заполненный), каждая точка будет иметь свое значение и из-за этого свой оттенок цвета, в результате...

153
Натяжка уникальной верстки на билдер WP

Натяжка уникальной верстки на билдер WP

Вообщем есть уникальный дизайнНеобходимо привязать к WP с возможностью редактирования контента из админки

105