如果线程调度程序一次运行一个线程,那么 java 如何提供多线程?



以下是我在java t点上看到的关于线程调度程序的内容。

Java 中的线程调度程序

Java 中的线程调度器是 JVM 的一部分,用于决定哪个线程应该运行。

不能保证线程调度程序会选择哪个可运行的线程来运行。

一个进程中一次只能运行一个线程。

线程调度器主要使用抢占式或时间切片调度来调度线程。

您引用的来源听起来有些过时了。在当今的JVM实现中,Java使用底层操作系统线程。

换句话说:Java 线程由 JVM映射到操作系统提供的线程。例如,请参阅此处。

从这个意义上说,系统的"真正的"多线程功能在很大程度上取决于JVM实现/版本和操作系统类型/版本;甚至底层硬件的功能。但请放心:在当前的系统中,Java能够以"真正的并行"方式运行许多线程。

在你的上下文中 - Java在某些时候使用"绿色线程"(然后Java将管理线程( - 但这是计算机科学史(过去很多年(。例如,请参阅此处。

Java 中的线程调度器是 JVM 的一部分,用于决定哪个线程应该运行。

关闭,但是... 在过去的几十年里,任何人用于实际工作的大多数JVM都使用"本机线程"。 这意味着,调度是操作系统的工作。 JVM不参与。

不能保证线程调度程序将选择哪个可运行的线程来运行。

没错,但是...,操作系统实现了线程调度策略(它可能能够实现由系统管理员选择的多个策略中的任何一个(。 如果您了解该策略,那么原则上您可以知道接下来将安排哪个线程。

但是,因为Java语言规范没有说明线程调度策略,并且如果您正在编写"随处运行"的Java程序,那么您不应该依赖任何特定的策略。

一个

进程中一次只能运行一个线程。

错,但是...这是真的,也许三十年前。 如今,几乎所有的计算机、平板电脑和手机都有不止一个处理器。 在任何给定时刻,每个处理器上都可以运行一个线程。

线程调度

器主要使用抢占式或时间切片调度来调度线程。

是的。 任何给定操作系统上的线程调度程序主要不执行任何操作,它实现策略。在大多数电脑、平板电脑和手机上,政策选择都将是先发制人的。 这意味着线程可以在任何时间点取消调度(例如,i++;语句的中途(。

抢占式多任务处理的替代方法称为协作式多任务处理,其中线程只能在某些明确定义的屈服点上失去对处理器的轮到。 这就是Thread.yield()的目的,但我不知道你会在哪里找到在协作式多任务环境中运行的Java。

如果您的机器支持,则可以同时在一个进程中运行多个线程。

您拥有的信息非常过时。当每个进程实际上都是一个线程(Windows 3.1,或旧的Unix内核,Macintosh系统7(时,你所描述的对操作系统是有效的。那时,作为单个进程运行的 JVM 必须实现自己的线程调度程序和线程管理。

今天,所有通用平台都支持本机多线程,默认情况下JVM使用底层系统实现