在构建 HTTP 网络服务器的上下文中……我们了解到,从理论上讲,为每个请求创建和销毁线程的成本相对较高,而且也无法扩展。这是常识(或者我希望是)。线程池是这里的解决方案……但我有点想在较低的层次上理解事物,而不是简单地接受理论是正确的。
当然,我们可以使用 JMeter 运行黑盒测试来查看应用程序在负载下的性能如何,但是如果我想真正观察它为什么会发生呢?探查器工具能否告诉我每个请求的线程分配如何以及为什么成本高昂?
谢谢!
最佳答案
如果您想自己测量,可以这样做。
这种智慧的诞生很可能是在很久以前,那时创建线程的成本要高得多。例如在 Linux 上,每个线程都是一个新进程。
“昂贵”对于不同的应用程序也意味着不同的东西。如果您的系统的每个请求都需要很长时间,那么增加一毫秒不会有太大区别。如果每个请求都需要几毫秒,那么仅仅为了启动线程而增加一毫秒是非常糟糕的。
import java.util.ArrayList;
import java.util.List;
public class ThreadRestarterMain {
public static void main(String... ignored) throws InterruptedException {
long start = System.currentTimeMillis();
// time how long it takes to start a few threads and stop them again.
int threads = 2000;
List<Thread> threadList = new ArrayList<>();
while (threadList.size() < threads) {
Thread e = new Thread(new Runnable() {
@Override
public void run() {
Thread.yield();
}
});
e.start();
threadList.add(e);
}
for (Thread thread : threadList) {
thread.join();
}
long time = System.currentTimeMillis() - start;
System.out.printf("Took %.3f ms on average to start/stop a thread%n", (double) time / threads);
}
}
这会打印类似的东西
Took 0.055 ms on average to start/stop a thread
只有你知道这是不是一个很大的数字。
注意:如果你有线程本地资源,这会使这个时间更长。同样,这取决于您在做什么。
关于java - 如何分析线程生命周期性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24424957/