当前位置: 首页 > 面试题库 >

单线程与多线程JMS生产者

魏冷勋
2023-03-14
问题内容

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

然后,我使用了相同的生产者对象(一个连接但有多个会话),并使用线程大小为8的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次,但结果保持不变。


问题答案:

从JMS应用程序的角度来看,您已将应用程序编写为多线程。多个会话,每个会话都有各自的JMS生产者对象,这些对象由单独的线程驱动。假设您的应用程序对资源(例如锁等)没有争用,那是好的。

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

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

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



 类似资料:
  • 为什么单线程和多线程脚本具有相同的处理时间?多线程实现不是应该少1/#线程数吗?(我知道当您达到最大cpu线程时,回报会递减) 我搞砸了我的实现吗?

  • 问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间

  • 我想检查多线程是否比单线程快,然后我在这里做一个演示: 首先,我用二和方法运行singleThreadStart,结果是 然后我运行第二个ThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行fiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的

  • 问题内容: 我编写了一个单一的Kafka使用者(使用Spring Kafka),该使用者从单个主题中读取内容,并且是使用者组的一部分。消耗完一条消息后,它将执行所有下游操作,并移至下一个消息偏移。我将其打包为WAR文件,并且我的部署管道将其推送到单个实例。使用部署管道,我可以将该工件部署到部署池中的多个实例。 但是,当我希望多个消费者作为基础架构的一部分时,我无法理解以下内容: 实际上,我可以在部

  • 我编写了一个Kafka消费者(使用Spring Kafka),它从单个主题读取并且是消费者组的一部分。一旦消息被消费,它将执行所有下游操作并继续下一个消息偏移量。我已将其打包为WAR文件,我的部署管道将其推送到单个实例。使用我的部署管道,我可能可以将此工件部署到我的部署池中的多个实例。 但是,当我希望多个消费者作为我的基础设施的一部分时,我无法理解以下内容- > 实际上,我可以在部署池中定义多个实