我试图编写一个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循环要快得多。
您是否在所有线程之间共享一个连接(一个生产者)?如果是这样,那么可能是您在那里遇到了一些线程争用,并且您仅限于生产者和代理之间的套接字连接速度。当然,这将很大程度上取决于您正在使用的jms实现(以及是否使用asyncSends)。
我将建议您使用完全独立的生成器来重复测试(尽管在消息排序方面,您将失去“队列”语义,但我认为这是可以预期的)。
另外,我不建议运行具有100个线程之类的数字的性能测试。请记住,您的多线程功能有时会受到计算机所拥有的内核数量的限制(或多或少,此处您还拥有大量IO,因此它可能比内核多一些线程,但100个线程可能会有所帮助)。我认为这不是一个很好的数字)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句