2014-09-25 4 views
3

여러 스레드를 사용하여 JMS 대기열에서 메시지를 보내고 읽는 Java 클래스를 작성하려고합니다. 아래 코드가 있습니다.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"); 

이 코드는 작동 (NumberOfThreads 및 NumberOfMessagesPerThread를 통해) 내가 말할 내 JMS 큐에 그러나 많은 메시지를 보냅니다. 그러나, 나는 그것이 정말로 다중 스레드로 작동하고 있다고 확신하지는 않습니다. 예를 들어 스레드를 10으로 설정하고 메시지를 100 개 (총 1000 개의 메시지)로 설정하면 100 개의 스레드와 10 개의 메시지가 같은 시간이 걸립니다. 아래의 코드조차도 같은 시간이 걸립니다.

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

스레딩 작업을 수행하고 있습니까? 다중 스레드 코드가 일반 for 루프보다 훨씬 빠를 것이라고 기대합니다.

답변

5

모든 스레드에서 단일 연결 (하나의 Producer)을 공유하고 있습니까? 그렇다면 아마 당신은 거기에 약간의 스레드 경합을 치는 것입니다. 그리고 당신은 당신의 생산자와 당신의 중개인 사이의 소켓 연결의 속도로 제한됩니다. 물론, 여러분이 사용하고있는 jms 구현 (그리고 asyncSend를 사용하는지 아닌지)에 많이 의존 할 것입니다.

완전히 별도의 제작자를 사용하여 테스트를 반복하는 것이 좋습니다 (메시지 순서와 관련하여 "대기열"의미를 잃지 만 예상되는 것 같습니다).

또한 100 개의 스레드처럼 높은 숫자로 성능 테스트를 실행하지 않는 것이 좋습니다. 멀티 쓰레딩 기능은 머신의 코어 용량에 따라 어느 정도 제한됩니다 (더 많거나 적다면 여기에 많은 IO를 가지므로 코어보다 스레드를 몇 개 더 가질 수 있지만 100은 충분합니다). 정말 내 의견에 좋은 번호)

+2

마지막 단락은 중요합니다. 측정 수행시 항상 단일 스레드로 시작하고 거기에서 점진적으로 이동하십시오. 어떤 시점에서는 공연이 중단되기 시작할 수도 있습니다. – Deltharis

관련 문제