Java:使用多个线程将消息发送到JMS队列

Mat*_*att 3 java multithreading jms

我正在尝试编写一个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");
Run Code Online (Sandbox Code Playgroud)

这段代码工作并向我的JMS队列发送许多消息(通过NumberOfThreads和NumberOfMessagesPerThread).但是,我不相信它确实是多线程的.例如,如果我将线程设置为10并将消息设置为100(总共1000条消息),则每个线程需要100个线程和10条消息.即使下面的代码也需要相同的时间.

    for (int i = 0; i < 1000; i ++) {
        sendMessage("Hello");
    }
Run Code Online (Sandbox Code Playgroud)

我正在做线程吗?我希望多线程代码比简单的for循环快得多.

Cla*_*dio 5

您是否跨所有线程共享单个连接(单个生产者)?如果是这样,那么你可能会在那里遇到一些线程争用,并且你的生产者和你的经纪人之间的套接字连接的速度是有限的.当然,它在很大程度上取决于您正在使用的jms实现(如果您使用的是asyncSends).

我建议你使用完全独立的生成器来重复测试(尽管,你会在消息排序方面失去"队列"语义,但我想这是预期的).

此外,我不建议运行性能测试,其数字如此高,如100线程.请记住,您的多线程功能在某种程度上受到您加工的内核数量的限制(或多或少,您在这里也有很多IO,所以它可能有助于拥有比内核更多的线程,但是100是在我看来,这不是一个很好的数字)

  • 最后一段很重要 - 在测量性能总是从单线程开始,然后从那里逐步移动.在某些时候,性能甚至可能开始下降. (2认同)