2014-09-25 234 views
3

我正在尝试编写一个Java类来同时使用多线程发送和读取来自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"); 

此代码的工作,并将然而,许多消息,我的JMS队列,我说的(通过NumberOfThreads和NumberOfMessagesPerThread)。但是,我不相信这是真正的多线程工作。例如,如果我将线程设置为10并将消息设置为100(因此总数为1000条消息),则每个线程需要100条线程和10条消息。即使下面的代码也是一样。

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

我在做线程的权利吗?我期望多线程代码比仅仅一个普通的for循环要快得多。

回答

5

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

我会推荐你​​使用完全独立的生产者来重复你的测试(尽管你会失去消息排序的“队列”语义,但我想这是预期的)。

此外,我不建议运行性能测试,如100个线程那么高。请记住,你的多线程能力在某种程度上受到你机器核心数量的限制(或多或少,你在这里也有很多的IO,所以它可能比核心有更多的线程,但100是没有真正在我看来,一个好的号码)

+2

最后一段很重要 - 在测量性能时总是从单线程开始,然后从那里递增地移动。在某些时候,性能甚至可能开始下降。 – Deltharis 2014-09-25 12:10:52