Produtor JMS simples versus multiencadeado

Eu queria ver quanta diferença de tempo faria com o uso de um produtor multithread em vez de um único thread thread. Eu configurei um ActiveMQ na minha máquina local, escrevi uma classe de produtor que inicializaria e iniciaria uma conexão JMS em seu construtor. Defino o limite de mensagens para 3M e demorou cerca de 50 segundos para enviar todas as mensagens para o ActiveMQ. Enviei apenas uma sequência de "olá mundo" 3M vezes.

Em seguida, usei o mesmo objeto produtor (uma conexão, mas várias sessões) e o executei com um ExecutorService de tamanho de segmento oito. Norun método, eu dividiria 3M por 8 apenas para garantir que cada thread não envie mais que 375000 mensagens. Demorou cerca de 60 segundos para enviar todas as mensagens neste caso.

ExecutorService service = Executors.newFixedThreadPool(8);

    for (int i = 0; i < 8; i++) {

        service.execute(producer);
    }

Em seguida, criei oito produtores, cada um com sua própria conexão e os executei com o ExecutorService ou com o tamanho oito. Desta vez, demorou cerca de 68 segundos para enviar todas as mensagens da 3M.

for (int i = 0; i < 8; i++) {
        service.execute(new Producer());
    }

Estou me perguntando, por que um único produtor de threads apresentaria melhor desempenho aqui? Eu executei cada cenário cerca de 10 vezes, mas os resultados permaneceram os mesmos.

questionAnswers(6)

yourAnswerToTheQuestion