Прежде всего:
Желательно создавать приложение, используя java 5 одновременный API
Если ваше приложение создано вокруг ExecutorService , то довольно легко изменить количество используемых потоков. Например: вы можете создать пул потоков, в котором количество потоков определяется конфигурацией. Так что если вы хотите изменить количество потоков, вам нужно изменить только некоторые свойства.
О вашем вопросе:
- О чтении вашего сокета: Насколько я знаю, бесполезно (если вообще возможно) иметь два потока, считывающих данные из одного сокета. Просто используйте один поток, который читает сокет, но сделайте в этом потоке как можно меньше действий (например, прочитайте сокет - поместите данные в очередь - прочитайте сокет - и т. Д.).
- О потреблении очереди: Целесообразно построить эту часть, как указано выше, чтобы было легко изменить количество потребляющих потоков.
- Примечание: вы не можете предсказать, что лучше, может быть другая часть, которая является узким местом, и так далее. Только монитор / профилирование дает вам реальное представление о вашей ситуации. Но если ваше приложение построено так, как описано выше, его действительно легко протестировать с различным количеством потоков.
Короче говоря:
- Часть производителя : один поток, который читает только из сокета и помещает в очередь
- Consumer part : создан вокруг ExecutorService, поэтому легко адаптировать количество потребляющих потоков
Затем с помощью профилирования определите узкие места и используйте A-B-тестирование, чтобы определить оптимальное количество потребляющих потоков для вашей системы