Mat*_*att 3 java multithreading 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");
Run Code Online (Sandbox Code Playgroud)
这段代码工作并向我的JMS队列发送许多消息(通过NumberOfThreads和NumberOfMessagesPerThread).但是,我不相信它确实是多线程的.例如,如果我将线程设置为10并将消息设置为100(总共1000条消息),则每个线程需要100个线程和10条消息.即使下面的代码也需要相同的时间.
for (int i = 0; i < 1000; i ++) {
sendMessage("Hello");
}
Run Code Online (Sandbox Code Playgroud)
我正在做线程吗?我希望多线程代码比简单的for循环快得多.
您是否跨所有线程共享单个连接(单个生产者)?如果是这样,那么你可能会在那里遇到一些线程争用,并且你的生产者和你的经纪人之间的套接字连接的速度是有限的.当然,它在很大程度上取决于您正在使用的jms实现(如果您使用的是asyncSends).
我建议你使用完全独立的生成器来重复测试(尽管,你会在消息排序方面失去"队列"语义,但我想这是预期的).
此外,我不建议运行性能测试,其数字如此高,如100线程.请记住,您的多线程功能在某种程度上受到您加工的内核数量的限制(或多或少,您在这里也有很多IO,所以它可能有助于拥有比内核更多的线程,但是100是在我看来,这不是一个很好的数字)