2014-09-25 128 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