Я хотел посмотреть, сколько разницы во времени было бы для использования многопоточного производителя вместо однопоточного. Я настраиваю ActiveMQ на моем локальном компьютере, называет класс производителя, который инициализирует и запускает JMS-соединение в своем конструкторе. Я установил ограничение на сообщение до 3M, и потребовалось около 50 секунд, чтобы отправить все сообщения в ActiveMQ. Я отправил только одну строку «hello world» 3M раз.Single vs Multi-threaded JMS Producer
Затем я использовал один и тот же объект-производитель (одно соединение, но несколько сеансов) и запустил его с помощью ExecutorService с размером потока восемь. В методе run
я разделил бы 3M на 8, чтобы убедиться, что каждый поток отправляет не более 375000 сообщений. В этом случае потребовалось около 60 секунд для ввода всех сообщений.
ExecutorService service = Executors.newFixedThreadPool(8);
for (int i = 0; i < 8; i++) {
service.execute(producer);
}
Затем я создал восемь производителей с каждым производством, имеющей своей собственной связью и побежал их с ExecutorService или нитью размером восемь. На этот раз потребовалось около 68 секунд, чтобы нажать все сообщения 3M.
for (int i = 0; i < 8; i++) {
service.execute(new Producer());
}
Мне интересно, почему один производитель резьбой лучше работает здесь? Я провел каждый сценарий примерно в 10 раз, но результаты остались прежними.
Спасибо Тиму, в моем последнем сценарии каждая нить откроет совершенно новое соединение, поэтому не будет обмена соединениями, но все равно никакого улучшения. Может быть, потому, что я запускаю как MQ Server, так и Producer на одном компьютере? – Abidi
Тим, я никогда не просил оптимизировать код. Я хотел знать, почему здесь работает многопоточный продюсер. Ваш комментарий по-прежнему не касается моего вопроса. – Abidi
Поскольку несколько потоков не всегда равны более высокой производительности. –