Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用多线程向JMS队列发送消息_Java_Multithreading_Jms - Fatal编程技术网

Java:使用多线程向JMS队列发送消息

Java:使用多线程向JMS队列发送消息,java,multithreading,jms,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

我试图编写一个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");
System.out.println(“发送消息”);
long startTime=System.nanoTime();
线程线程[]=新线程[NumberOfThreads];
对于(int i=0;i
这段代码可以工作并将我所说的任何数量的消息发送到我的JMS队列(通过NumberOfThreads和NumberOfMessagesPerThread)。然而,我不相信它是真正的多线程工作。例如,如果我将线程设置为10,消息设置为100(总共1000条消息),那么它所用的时间与100个线程和10条消息所用的时间相同。即使下面的代码也需要相同的时间

    for (int i = 0; i < 1000; i ++) {
        sendMessage("Hello");
    }
for(int i=0;i<1000;i++){
发送消息(“你好”);
}

我穿线对吗?我希望多线程代码比普通for循环快得多。

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

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


此外,我不建议运行数量如此之多的性能测试,比如100个线程。请记住,您的多线程功能在某种程度上会受到您的机器拥有的内核数量的限制(或多或少,您在这里也有很多IO,因此比内核多几个线程可能会有所帮助,但在我看来,100并不是一个很好的数字)

我还想回顾一下本文中的一些评论


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

最后一段很重要-在测量性能时,始终从单线程开始,然后从单线程开始逐步移动。在某个时候,性能甚至可能开始下降。