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

Muk*_*t09 5 java multithreading jvm

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

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

同样,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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ger 8

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

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

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

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

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