JVM线程调度程序如何控制多处理器的线程?

时间:2017-01-20 08:37:17

标签: java multithreading jvm

我一直在阅读Head First的多线程。我对多线程的了解是:

当我们使用线程类的对象调用 start()时,该线程将进入 Runnable 状态。因此,在通过这些线程的对象调用 start()之后,所有线程都进入 Runnable 状态。它是 JVM线程调度程序 ,它从 Runnable 状态中随机选择线程,以便在运行状态下提供该线程。进入运行状态后,将执行该特定线程的确定调用堆栈。

同样,JVM线程调度程序可以通过从运行状态选择该线程到Runnable状态来停止执行线程。这次,代码执行暂停在该线程的调用堆栈中。

  

现在我的问题是,对于多处理器机器,如何JVM线程   调度程序从Runnable状态中选择线程?它只选一个   线程并将其交给处理器?或者,它选择不止一个   线程并将这些线程赋予运行状态不同   处理器?

我写了以下代码:

// Class of main thread
public class ThreadMain {

    public static void main(String[] args) {

        Runnable threadJob=new MyRunnable();
        Thread t=new Thread(threadJob);
        t.start();
        System.out.println("Back in the Main");
    }
}
// Class of another thread
public class MyRunnable implements Runnable{

    public void run()
    {
        System.out.println("I'm Thread");
    }
}

这里有两个主题。主线程,以及我创建的主题。如果我的机器有多处理器,它会如何表现? JVM线程调度程序是否会一次选择两个线程,并将它们分配给两个多处理器?

3 个答案:

答案 0 :(得分:7)

如果我们将操作系统,JVM和类库视为一个整体的执行环境,那么术语“JVM线程调度程序”才有意义。然后,无论如何实现,都保证此环境具有调度程序。

在今天的大部分实现中,JVM将为每个Java线程创建一个操作系统级线程,并且本身不会执行活动的调度活动。但是特定的JVM实现可能包含没有操作系统的调度程序。

例如,对于Sun的JVM来说,就像上个世纪的情况一样。此时,可以选择使用green threads,而不是本机线程。请注意,在没有操作系统帮助的情况下实现的这些线程无法使用多个CPU /核心。

因此在实践中,当您运行示例程序时,操作系统的调度程序可能确实将第二个线程分配给不同的核心。但是,由于这是一个很小的程序,第一个线程也可能在第二个线程开始实际工作之前终止,在这种情况下,它可能会在第一个线程上运行,但是没有任何保证。特别是调度行为。

虽然没有关于特定调度行为的保证,但大多数SMP库和工具都是基于(已建立的)假设构建的,如果有足够的可运行线程具有足够的工作负载,则底层系统会将这些线程分配给可用的CPU核心

答案 1 :(得分:1)

JVM使用底层操作系统(Unix,Windows等)线程机制在多处理器系统上调度java线程。

答案 2 :(得分:0)

当其他人回答正确时,JVM使用底层操作系统(在我的情况下为Windows 10)来管理线程。 Windows操作系统将进行抢占式(基于优先级)调度。如果存在多个具有最高优先级的线程,则Windows将对这些线程使用基于轮询的时间分片调度。

(参考:-https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities

要回答有关多处理器系统(此处又称为OS的窗口)的特定问题,这取决于该系统使用的体系结构。通常有两种类型的架构

  1. NUMA-非统一内存访问
  2. SMP-对称多处理

对于NUMA,线程被分配给一个处理器(在物理上更接近所使用的内存)。因为这样可以更快地访问内存。

但是,在SMP计算机中,两个或更多相同的处理器或内核连接到单个共享主内存。从本质上讲,这就像在单个集成处理器上运行事物。在这里,我们不能保证线程将分配给哪个处理器。

您还可以通过设置“ ThreadAffinity”或“ Thread Ideal Processor”属性来指定要在特定处理器上执行的线程。

(参考:-https://docs.microsoft.com/en-us/windows/win32/procthread/multiple-processors)。

希望这会有所帮助!欢呼!!