почему вы используете отдельные очереди?Обычный способ распределить работу - это иметь одну общую очередь, из которой все рабочие читают.в Java вы можете легко сделать это, используя общий BlockingQueue.таким образом, задания могут распределяться более равномерно (работник не будет вытягивать задания из очереди, если он занят).в вашей стратегии очередь медленного работника может в конечном итоге создать отставание.чтобы избежать переполнения очереди, вы можете установить в нее максимальный размер, и тогда производитель сделает паузу, когда ваше отставание станет слишком большим.
вы упоминаете, что хотите, чтобы все происходило быстрее.Хотя приведенные выше рекомендации могут помочь, а могут и не помочь, единственный способ действительно решить проблему - запустить систему под профилировщиком и посмотреть, где находится узкое место (часто это не то, что вы думаете),в противном случае вы можете потратить много времени на оптимизацию кода, который не поможет.Есть много хороших бесплатных профилировщиков для java (netbeans, jvisualvm, eclipse) и c ++ (valgrind).отличным несвободным для java является yourkit java profiler.