Любые предложения о том, как это сделать?
Что ж, дизайн высокого уровня будет состоять из потока читателя, потока писателя и ExecutorService
экземпляр для обработки.
Поток читателя читает файл JSON, используя потоковый API 1 . Когда он определил единицу работы, которая должна быть выполнена, он создает задачу и передает ее в службу исполнителя и повторяет ее.
Сервер-исполнитель обрабатывает поставленные им задачи. Вам следует использовать службу с ограниченным пулом потоков и, возможно, с ограниченной / блокирующей рабочей очередью.
Поток модуля записи сканирует Future
объекты, созданные при отправке задачи, и использует их дляполучить результаты задачи (по порядку), сгенерировать вывод из результатов и записать вывод в файл.
Если выходной файл не должен быть в порядке, вы можетеобойтись без потока писателя 2 и попросить задачи записать в файл. Им нужно будет использовать общую блокировку или мьютекс, чтобы за один раз в файл записывалась только одна задача.
1 - Если вы этого не сделаете, то: 1) вам нужно уметьпроанализировать и сохранить весь входной файл в памяти, и 2) поток чтения не сможет начать отправлять задачи, пока не закончит анализ ввода.
2 - Сделайте этоесли это упрощает вещи, а не по причинам производительности. Необходимость взаимного исключения во время записи убивает любые гипотетические преимущества в производительности.
Как отмечает @Thilo, мало что можно получить, если попытаться создать несколько потоков чтения. (И очень много сложностей, если вы попробуете!)