JVM线程的概念以及与OS线程的关系

问题描述 投票:3回答:1

这是我对CPU和线程的基本了解(天真!)。处理器每个内核可以运行一个线程。笔记本电脑上的系统信息如下所示处理器Intel(R)Core(TM)i7-8650U CPU @ 1.90GHz,2112 Mhz,4 Core(s),8逻辑处理器**可以并行运行8个线程**为了验证我的理解,我创建了一个Spring Boot(嵌入式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秒也不现实,因为我的系统上正在运行其他应用程序,例如浏览器,JMeter和IntelliJ,它们应自行解决一些线程问题。

我观察到相反的行为-观察到的总运行时间为5秒系统如何运行超出限制的线程?(我发现一些关于线程以及底层处理器似乎如何并行化线程的理解错误)

java multithreading processor
1个回答
5
投票

确实,系统只能同时运行8个线程,但是操作系统可以调度八个线程中的哪个线程在任何给定时间运行,并且preempttime slice进程都可以为某些进程调度其他(等待)进程时间的一部分。 Java线程与本地线程是同构的,因此实际上是操作系统对其进行调度(并且,如果您的计算机按您认为的那样工作,则network将在程序运行时停止工作)。

© www.soinside.com 2019 - 2024. All rights reserved.