Один против многопоточного JMS-производителя

Я хотел посмотреть, сколько разницы во времени будет иметь использование многопоточного производителя вместо однопоточного. Я установил ActiveMQ на своем локальном компьютере, написал класс производителя, который инициализирует и запускает соединение JMS в своем конструкторе. Я установил лимит сообщений на 3M, и для отправки всех сообщений в ActiveMQ потребовалось около 50 секунд. Я отправил только одну строку "Hello World" 3 раза.

Затем я использовал один и тот же объект-производитель (одно соединение, но несколько сеансов) и запустил его с помощью ExecutorService с размером потока восемь. вrun метод, я бы разделил 3M на 8, чтобы убедиться, что каждый поток отправляет не более 375000 сообщений. В этом случае для отправки всех сообщений потребовалось около 60 секунд.

ExecutorService service = Executors.newFixedThreadPool(8);

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

        service.execute(producer);
    }

Затем я создал восемь производителей, каждый из которых имел собственное соединение, и запустил их с помощью ExecutorService или потока размером восемь. На этот раз все сообщения 3М заняли около 68 секунд.

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

Мне интересно, почему однопоточный производитель будет лучше работать здесь? Я запускал каждый сценарий около 10 раз, но результаты остались прежними.

Ответы на вопрос(6)

Ваш ответ на вопрос