我正在尝试编写一个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循环要快得多。
答案 0 :(得分:5)
您是否在所有线程中共享单个连接(单个Producer)?如果是这样,那么你可能会在那里遇到一些线程争用,并且你的生产者和你的经纪人之间的套接字连接的速度是有限的。当然,它将在很大程度上取决于您正在使用的jms实现(如果您使用的是asyncSends)。
我建议你使用完全独立的制作人重复你的测试(尽管你会丢失&#34;队列&#34;语义排序方式,但我猜这是预期的。)
另外,我不建议运行性能测试,其数字如此高,如100线程。请记住,您的多线程功能在某种程度上受到您加工的内核数量的限制(或多或少,您在这里也有很多IO,所以它可能有助于拥有比内核更多的线程,但是100是在我看来并不是一个很好的数字)
答案 1 :(得分:1)
我还会回顾一下这篇文章Single vs Multi-threaded JMS Producer
中的一些评论'sendMessage'的实现是什么?如何重用连接,会话和生成器?