【问题标题】:Java: Sending messages to a JMS queue with multiple threadsJava:将消息发送到具有多个线程的 JMS 队列
【发布时间】:2014-11-20 04:46:50
【问题描述】:

我正在尝试编写一个 Java 类来使用多个线程从 JMS 队列发送和读取消息以加快速度。我有以下代码。

    System.out.println("Sending messages");
    long startTime = System.nanoTime();

    Thread threads[] = new Thread[NumberOfThreads];
    for (int i = 0; i < threads.length; i ++) {
        threads[i] = new Thread() {
            public void run() {
                try {
                    for (int i = 0; i < NumberOfMessagesPerThread; i ++) {
                        sendMessage("Hello");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        threads[i].start();
    }

    //Block until all threads are done so we can get total time
    for (Thread thread : threads) {
        thread.join();
    }

    long endTime = System.nanoTime();
    long duration = (endTime - startTime) / 1000000;
    System.out.println("Done in " + duration + " ms");

此代码有效,并且向我所说的 JMS 队列发送了许多消息(通过 NumberOfThreads 和 NumberOfMessagesPerThread)。但是,我不相信它真的是多线程的。例如,如果我将线程设置为 10,消息设置为 100(因此总共 1000 条消息),则它需要与 100 个线程和每个 10 条消息相同的时间。甚至下面的这段代码也需要同样的时间。

    for (int i = 0; i < 1000; i ++) {
        sendMessage("Hello");
    }

我做的线程正确吗?我希望多线程代码比普通的 for 循环快得多。

【问题讨论】:

    标签: java multithreading jms


    【解决方案1】:

    我还将回顾这篇文章中的一些 cmets Single vs Multi-threaded JMS Producer

    “sendMessage”的实现是什么。如何重用连接、会话和生产者?

    【讨论】:

      【解决方案2】:

      您是否在所有线程之间共享单个连接(单个生产者)?如果是这样,那么您可能在那里遇到了一些线程争用,并且您受限于生产者和代理之间的套接字连接速度。当然,这在很大程度上取决于您使用的 jms 实现(以及是否使用 asyncSends)。

      我建议您使用完全独立的生产者重复您的测试(尽管在消息排序方面您将失去“队列”语义,但我想这是意料之中的)。

      另外,我不建议使用像 100 个线程这样的高数量来运行性能测试。请记住,您的多线程能力在某些时候受到您机器拥有的内核数量的限制(或多或少,您在这里也有很多 IO,因此拥有比内核更多的线程可能会有所帮助,但是 100 是我认为这不是一个很好的数字)

      【讨论】:

      • 最后一段很重要——在衡量性能时,总是从单线程开始,然后从那里逐步移动。在某些时候,性能甚至可能开始下降。
      猜你喜欢
      • 2016-05-02
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2020-07-31
      • 2015-12-03
      • 2011-10-23
      相关资源
      最近更新 更多