我正在尝试编写一个 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 是在我看来这不是一个很好的数字)
关于Java:将消息发送到具有多个线程的 JMS 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26038118/