gpt4 book ai didi

java - 单线程与多线程 JMS 生产者

转载 作者:搜寻专家 更新时间:2023-11-01 02:44:33 24 4
gpt4 key购买 nike

我想看看使用多线程生产者而不是单线程生产者会产生多少时间差异。我在本地机器上设置了一个 ActiveMQ,编写了一个生产者类,该类将在其构造函数中初始化并启动 JMS 连接。我将消息限制设置为 3M,将所有消息推送到 ActiveMQ 大约需要 50 秒。我只发送了一个字符串“hello world” 3M 次。

然后我使用相同的生产者对象(一个连接但多个 session )并使用线程大小为 8 的 ExecutorService 运行它。在 run 方法中,我会将 3M 除以 8,以确保每个线程发送的消息不超过 375000 条。在这种情况下,推送所有消息大约需要 60 秒。

ExecutorService service = Executors.newFixedThreadPool(8);

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

service.execute(producer);
}

然后我创建了八个生产者,每个生产者都有自己的连接,并使用 ExecutorService 或线程大小 8 运行它们。这次推送所有3M消息大约用了68秒。

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

我想知道,为什么单线程生产者在这里表现更好?每个场景我都运行了大约 10 次,但结果保持不变。

最佳答案

从 JMS 应用程序的角度来看,您已将应用程序编写为多线程;多个 session ,每个 session 都有自己的 JMS 生产者对象,由单独的线程驱动。假设您的应用程序没有争用锁等资源,这很好。

就发送消息的效率而言,取决于 JMS 提供程序在客户端和服务器端的实现效率。 JMS 实现中是否存在任何锁定或争用?也许它试图通过同一个套接字发送所有内容 - 在这种情况下存在争用。或者可能还有其他锁。

也许底层队列数据结构服务器端有一个锁服务器端。

要回答您的问题确实需要详细了解特定的 JMS 提供程序。

关于java - 单线程与多线程 JMS 生产者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25832159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com