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

时间:2017-07-25 08:36:29

标签: java multithreading

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

  

Java中的线程调度程序

     

java中的线程调度程序是JVM的一部分,它决定应该运行哪个线程。

     

无法保证线程调度程序将选择运行哪个可运行线程。

     

一次只能运行一个线程。

     

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

  

java中的线程调度程序是JVM的一部分,它决定应该运行哪个线程。

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

  

无法保证线程调度程序选择运行哪个可运行线程[next]。

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

但是确实如此,因为Java语言规范没有提及有关线程调度策略的任何内容,如果您正在编写“随处运行”的Java程序,那么您不应该依赖任何特定的策略。

  

一次只能运行一个线程。

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

  

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

是。任何给定操作系统上的线程调度程序都不主要做任何事情,它实现策略。在大多数计算机,平板电脑和手机上,政策选择都将是抢先。这意味着可以在任何时间点(例如,i++;语句的一半)取消调度线程。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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