在本文开始前,先给大家分享几个好用的IDEA激活码
这里提供几个最新的激活码,有需要的朋友可以试试,先到先用:
2022和2023Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新)
2022和2023Pycharm激活码,Pycharm稳定专属激活码(持续更新)
2022和2023Webstorm激活码,Webstorm稳定专属激活码(持续更新)
在我们深入研究创建一百万个线程之前,让我们先看看 Java 线程的历史。
Java 线程从 Java 1.0 开始就存在,用于在 Java 应用程序中提供并发性。最初它们被称为“绿色线程”,主要是完全由 JVM 管理的线程。这是因为在 Java 1.0 发布时,CPU 大多是单核的,而且当时的操作系统不支持内核/平台线程(稍后会详细介绍)。这是一个一对多的 实现,其中一个实际线程可以满足多个 Java 线程的需求。这些 Java 线程有自己的调用堆栈,并且使用了大量内存。
但是随着 CPU 和操作系统变得越来越先进并支持内核/平台级线程,线程的 Java 实现也发生了变化。Java 后来采用了一对一的实现,其中 Java 线程实际上是内核/平台线程上的薄包装器。内核/平台线程由操作系统创建和管理,除了堆存储之外,包裹在内核/平台线程上的每个 Java 线程可能会消耗超过 1 兆字节的内存,并且创建起来非常昂贵。为了消除这种情况,使用线程池来重用 Java 线程。
这对 Java 应用程序可以支持并发的线程数有一个上限。引入了以下公式来计算理想的线程池大小。
线程池大小 = CPU 核心数 + 1
这一直是 Java 中的一个限制,因为其他更新的编程语言,如 Go(goroutines)、Akka(actors)和 Erlang(processes)有不同的并发编程模型。
为了解决这个限制,Loom 项目诞生了,以支持 Java 中的“虚拟线程”,它比现有的内核/平台包装线程更轻量级。现在,这些虚拟线程将再次由 JVM 管理,而不是由类似于 Java 1.0 的绿色线程的底层操作系统管理。Green threads 和 Virtual threads 之间的显着区别是 Virtual threads 可以有一个可以增长和收缩的动态调用堆栈,而 Green threads 有固定的调用堆栈,它会消耗内存。
为了实现虚拟线程,Loom 项目在 JVM 中引入了 3 个新概念。
- Scheduler——这是一个 ForkJoin 池,其大小通常等于 CPU 中的核心数。
- 载体线程——载体线程是一个内核/平台线程,将用于执行虚拟线程的任务。Scheduler 将有一个 Carrier Threads 池。虚拟线程的调用堆栈将在其运行时挂载和卸载到 Carrier 线程的堆栈。
- Continuation——这类似于 run,yield 调用,其中虚拟线程可以根据 JVM 完成的操作在运行和空闲之间切换。
例如:- 当虚拟线程进行数据库查询或 HTTP 请求等阻塞调用时,它可能会屈服,直到获得响应,以便其他虚拟线程可以执行。
因此,让我们看看实际的虚拟线程并将其与平台/内核线程进行比较。Java 19 发布了 Project Loom 的预览版,这是我用来执行此演示的项目。最初我运行了一个试图创建 100 万个平台/内核线程的应用程序。
发布者:admin,转转请注明出处:https://www.ajihuo.com/soft/5340.html