JVM 线程的概念以及与 OS 线程的关系
Concept of JVM thread and relation to OS thread
这是我对 CPU 和线程的基本理解(幼稚!)。处理器可以 运行 每个核心一个线程。
我的笔记本电脑上的系统信息如下所示
处理器 Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz,2112 Mhz,4 核,8 逻辑处理器
**可以运行 8个线程并行**
为了验证我的理解,我创建了一个 Spring Boot(embedded tomcat) 来处理每个请求
@GetMapping("/ping")
public String ping(@RequestParam String id) throws InterruptedException {
System.out.println(MessageFormat.format("The request id is {0}", id));
int i = Integer.parseInt(id);
long now = System.currentTimeMillis();
long period = 5000L;
long later = System.currentTimeMillis();
if (i % 2 == 1) {
while (later - now <= period) {
later = System.currentTimeMillis();
}
}
return PING_SUCCESSFUL;
}
我还将 tomcat 上的最大线程设置为以下
server.tomcat.max-threads=200
我现在使用 Apache JMeter 在 1 秒内触发 200 个请求
我的期望是我的系统被限制为 运行 只有 8 个线程,因此请求的总 运行 时间应该至少为 (200 / 8)*5 = 125 秒
然而,即使是 125 秒也不现实,因为我的系统上还有其他应用程序 运行ning,例如浏览器、JMeter、IntelliJ,它们本身应该考虑一些线程。
我观察到一个对比行为 - 观察到的总 运行时间是 5 秒。 系统怎么可能 运行 个线程超过限制?
(我发现对线程以及底层处理器似乎如何并行化线程的一些理解有误)
确实系统只能 运行 同时处理 8 个线程,但操作系统会在任何给定时间调度这八个线程中的哪一个 运行ning 并且都可以 preempt and time slice进程来安排其他(等待)进程的某个时间段。 Java 线程与本机线程同构,因此实际上是操作系统调度它们(如果您的计算机像您想象的那样工作,网络 将停止工作,而您的程序 运行).
这是我对 CPU 和线程的基本理解(幼稚!)。处理器可以 运行 每个核心一个线程。
我的笔记本电脑上的系统信息如下所示
处理器 Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz,2112 Mhz,4 核,8 逻辑处理器
**可以运行 8个线程并行**
为了验证我的理解,我创建了一个 Spring Boot(embedded tomcat) 来处理每个请求
@GetMapping("/ping")
public String ping(@RequestParam String id) throws InterruptedException {
System.out.println(MessageFormat.format("The request id is {0}", id));
int i = Integer.parseInt(id);
long now = System.currentTimeMillis();
long period = 5000L;
long later = System.currentTimeMillis();
if (i % 2 == 1) {
while (later - now <= period) {
later = System.currentTimeMillis();
}
}
return PING_SUCCESSFUL;
}
我还将 tomcat 上的最大线程设置为以下
server.tomcat.max-threads=200
我现在使用 Apache JMeter 在 1 秒内触发 200 个请求
我的期望是我的系统被限制为 运行 只有 8 个线程,因此请求的总 运行 时间应该至少为 (200 / 8)*5 = 125 秒
然而,即使是 125 秒也不现实,因为我的系统上还有其他应用程序 运行ning,例如浏览器、JMeter、IntelliJ,它们本身应该考虑一些线程。
我观察到一个对比行为 - 观察到的总 运行时间是 5 秒。 系统怎么可能 运行 个线程超过限制? (我发现对线程以及底层处理器似乎如何并行化线程的一些理解有误)
确实系统只能 运行 同时处理 8 个线程,但操作系统会在任何给定时间调度这八个线程中的哪一个 运行ning 并且都可以 preempt and time slice进程来安排其他(等待)进程的某个时间段。 Java 线程与本机线程同构,因此实际上是操作系统调度它们(如果您的计算机像您想象的那样工作,网络 将停止工作,而您的程序 运行).