Если я правильно понял, несколько рабочих все выбирают из одной очереди, делают вычисления и передают результат своим личным авторам, как:
/ [ worker ] - [ writer, queue ]
[ msg-queue ] - [ worker ] - [ writer, queue ]
\ [ worker ] - [ writer, queue ]
рабочие могут блокировать доступ к очереди сообщений, добавление считывателя, управляющего очередью рабочих элементов, решит эту проблему, если она возникнет, например:
/ [ worker ] - [ writer, queue ]
[ msg-queue ] - [ fetcher, queue ] - [ worker ] - [ writer, queue ]
\ [ worker ] - [ writer, queue ]
Еще одно замечание, которое я заметил в вашем описании, заключается в том, что в расчетах используется набор коллекций только для чтения, поэтому параллелизм не должен быть проблемой. Было бы неплохо выяснить, какую реализацию вы используете, даже если вы не синхронизируете использование в своей части кода, классы коллекций, такие как Vector и Hashtable, синхронизируются по умолчанию.
Использование неизменяемых версий классов коллекций помогло бы обеспечить одновременное использование карт по умолчанию.