当前位置: 首页 > 知识库问答 >
问题:

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

唐兴思
2023-03-14

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

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

同样,JVM线程调度器可以通过将线程从运行状态切换到可运行状态来停止线程的执行。这一次,代码执行在该线程的调用堆栈中暂停。

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

我写了以下代码:

// 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个答案

梁丘钊
2023-03-14

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

巫马化
2023-03-14

正如其他人正确回答的那样,JVM使用底层操作系统(在我的例子中是Windows 10)来管理线程。windows操作系统将执行先发制人(基于优先级)的调度。如果存在具有最高优先级的多个线程,windows将对这些线程使用基于循环的时间切片调度。

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

为了回答关于多处理器系统(这里的windows又是操作系统)的具体问题,它取决于这样一个系统正在使用的架构。通常有两种类型的架构

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

在NUMA的情况下,线程被分配给一个更接近(物理上)正在使用的内存的处理器。因为这样,内存访问速度更快。

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

您还可以通过设置“线程亲和力”或“线程理想处理器”属性来指定要在特定处理器上执行的线程。

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

希望这有帮助!!干杯

拓拔烨赫
2023-03-14

只有当我们把操作系统、JVM和类库视为一个整体的执行环境时,“JVM线程调度器”这个术语才有意义。然后,可以保证这个环境有一个调度器,不管它是如何实现的。

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

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

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

虽然无法保证特定的调度行为,但大多数SMP库和工具都是建立在(有根据的)假设之上的,即如果有足够的可运行线程和足够的工作负载,底层系统将把这些线程分配给可用的CPU核。

 类似资料:
  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 问题内容: 我试图了解Linux如何处理进程调度和线程调度。我读过Linux可以安排进程和线程。 Linux是否具有线程调度程序和进程调度程序?如果是,他们如何合作? 问题答案: 的Linux内核调度器被实际调度的任务,并且这些要么螺纹或(单线程)工艺。 因此,在调度程序的上下文中, 任务 (内核内部)是正在调度的事物,可以是某些 内核线程( 例如或),多线程进程的某些 用户线程 (例如)或单线程

  • 问题内容: Java如何确定分配线程或进程的内核?有什么办法可以控制吗?防止两个大线程在同一内核上执行? 基本上,我要问的是有关Java中多线程如何工作或如何在Java中控制它的更多信息。 问题答案: 您不能为特定线程设置处理器关联。但是,如果将程序分为两个进程,则应该能够将这些进程分配给操作系统级别的特定处理器。 http://www.cyberciti.biz/tips/setting-pro

  • 我有一个关于如何处理请求的问题,例如: 我已经创建了一个带有一个线程组的测试计划。 设置用户数(线程):10 加速期:20 循环计数:永远 在这个线程组中,我创建了5个HTTP请求。 当我点击start时,我知道它以1个用户开始,到20秒时,它将拥有所有10个用户。 每个采样器(http请求)是否分配给一个用户?每个采样器是否按顺序点火?它会触发并行请求吗?我试图了解整体工作。

  • 我必须使用Spring Batch配置一个作业。是否可以有一个单线程的项目阅读器,但多线程处理器? 在这种情况下,ItemReader将通过从数据库中读取工作项(通过执行预定义的查询)来创建要处理的工作项,每个处理器将并行处理项/块。

  • 问题内容: 我对多处理器机器中posix线程的并发性有一些疑问。我在SO中发现了类似的问题,但没有找到最终的答案。 以下是我的理解。我想知道我是否正确。 Posix线程是用户级线程,内核不知道。 内核调度程序会将Process(及其所有线程)视为一个用于调度的实体。依次是线程库选择要运行的线程。它可以在可运行线程之间划分内核给定的cpu时间。 用户线程可以在不同的cpu内核上运行。即让线程T1和T