Реализован конвейер, состоящий из Manager
, Reader
, Executor1
, Executor2
, Writer
, наследованные от Runnable
(Executor1
дергает Reader
, получает от него данные, обрабатывает, затем Executor2
дергает Executor1
, получает данные, обрабатывает и так далее).
Manager
ставит объекты на конвейер в нужном порядке, затем запускает Reader.run()
, который читает входной файл по кусочкам x байт и отдает его на обработку конвейеру.
Необходимо в менеджере создать n потоков Thread(Executor1)
, которые запустит Reader
, отдав каждому потоку x/n байт данных на обработку, которые в порядке очереди примет Writer
и запишет в выходной поток.
Проблема в том, что после первой итерации созданные потоки закрываются после Writer
, а нужно обработать целый файл. Как решить задачу, не создавая новые потоки, кроме тех n, которые в начале построения конвейера создал менеджер? Можно ли как-то возвращаться после записи в начало потока? Или кидать в поток новые данные еще до того, как старые успеют дойти до райтера и закончить запись (неясно как это реализовать)?
Код без тредов можно посмотреть тут или тут.
Если я правильно понял, вы хотите выполнять какую-то логику в разных потоках над данными которые берете из одного файла и записывать результат обработки в другой файл.
Могу посоветовать сделать один поток - читатель файла - его задача, считывать данные и записывать куски в некую очередь допустим preQueu.
Несколько потоков обработки - мониторят данные в очереди preQueu, если она не пустая берут кусок на обработку и результат записывает в другую очередь postQueu, если preQueu пустая - поток засыпает на некоторое время, после чего опять проверяет очередь preQueu и так в бесконечном цикле, пока менеджер не остановит поток.
Поток записи в файл - в бесконечном цикле (пока не остановит менеджер) мониторит очередь postQueu, если данные есть - записывает их в файл, если данных нет, то засыпает на некоторое время, после чего опять делает проверку.
Смущает только одна фраза:
которые в порядке очереди примет Writer
как только вы сделаете обработку в несколько потоков, вы не можете им указать в каком порядке они должны завершаться, соответственно записывать в файл они будут в том порядке в каком завершать потоки обработки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не могу понять, как вывести двумерный массив с помощью foreach на языке java
Всем привет! Нужно построить круг из точек( заполненный), каждая точка будет иметь свое значение и из-за этого свой оттенок цвета, в результате...
Вообщем есть уникальный дизайнНеобходимо привязать к WP с возможностью редактирования контента из админки