实际上,线程是一个抽象概念。它只是一个应该执行的原子进程。原子,我的意思是一个进程,如果你停止它(例如,因为它太长并且你想执行另一个),你需要存储它的当前状态并在继续执行该进程之前恢复它。现在,过程中的内容取决于您想要的内容。例如,如果我没记错的话,在 C 语言中,一种旨在构建操作系统的语言,进程基本上就是一个程序。该程序可以要求系统运行其他程序,或者派生自己以运行克隆(通过使用 fork() 函数)。无论是不同的程序还是克隆,无论如何它都是不同的进程,应该以原子方式执行。在 C 语言中,线程就是程序。在 Java 中,线程是扩展 Thread 的类。在 C 中,你通过执行它的 main() 函数来启动一个线程/程序,在 Java 中你通过执行它的 run() 方法来运行一个线程/类。这仅适用于线程概念。它只是程序或执行的线程实例的通用名称。
如今,计算机需要并行执行许多事情。它导致同时管理多个线程。这是线程池:它是要执行的线程列表。而已。一个简单的清单。但是有了这个,你就有了调度程序:你有给定数量的“处理器”,你需要决定在它们上执行哪些线程,但是你不能执行比你拥有的“处理器”更多的线程。调度器策略应该设计为尽可能多地节省时间,这取决于线程的内容和依赖关系。可以使用不同的策略,例如平衡的执行时间、循环、优先级等。
我将“处理器”放在引号中,因为我的意思是“计算单元”。它可以是计算机的物理处理器,也可以是 CPU,现在通常有 2 到 8 个内核(意味着它可以同时运行 2-8 个线程),并执行 CPU 指令(通常是 RISC)。它可以是显卡的处理器,也可以是 GPU,它有几十个或几百个内核,但使用不同的指令集。它也可以是来自 Java 虚拟机或 JVM 的处理器,它只能运行单个线程并使用自己的一组指令(字节码)。JVM 与前两个的主要区别在于 CPU 和 GPU 直接与硬件交互,无需中介,而 JVM 将自己的字节码转换为 RISC 指令并请求 CPU 执行它们。
CPU 使用自己的调度程序来执行其线程(RISC 指令块,而不仅仅是一个)。让我们称之为“系统线程”。但是当您使用 Java 编程时,您的执行环境不是系统,而是 JVM,它为您提供了系统的抽象(这就是您可以在任何机器上运行 Java 程序而无需关心下面的系统的方式)。这意味着不允许您直接与系统通信,因此 Java 为您提供了一种在其自身级别处理线程的方法,允许您创建线程 (new Thread()) 并将它们提供给调度程序 (SwingUtilities,执行人等)。您的 Java 线程如何转换为系统线程,以及您的 Java 调度程序如何用于替换系统调度程序,是 JVM 的工作。
因此,当您谈论 Java 中的线程时,您不会谈论系统级别的线程。这是 JVM,它将与系统交互,以便您有类似的行为。但是您的 Java 线程不是由 CPU 管理的,因此您可以请求特定的调度策略,而与 CPU 的调度策略无关。
Java中的线程调度是如何完成的?来自:https ://www.researchgate.net/post/How_is_Thread_scheduling_in_Java_done [2017 年 5 月 22 日访问]。