Java CPU 核心上的多线程执行

Java multi-threading execution on CPU core

上下文

假设我有一个简单的Java多线程程序

class Runner1 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Runner1: " + i);
        }
    }
}

class Runner2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Runner2: " + i);
        }
    }
}

public class App {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runner1());
        Thread t2 = new Thread(new Runner2());

        t1.start();
        t2.start();
    }
}

该程序 运行 在多核笔记本电脑上,例如4 个核心。我对related post的理解是多线程可以在单核上执行。

问题

我想知道 JAVA 2 线程在 cpu 上执行的行为。

这2个线程是由一个cpu核心执行还是分配给不同的cpu核心执行?是否有机制或默认方案来决定分配?

谢谢!

每个线程都有一个跟踪其状态的执行堆栈。两个线程运行在相同的CPU或不同的CPU上并不重要。实际上通常发生的情况是,一个线程运行一次一点点,同样的CPU可以来回切换,运行一个线程一会儿,运行宁愿对方一会儿。

当线程分配到不同的CPU时,那么共享对象更新冲突的可能性更大,因为线程可能同时运行ning导致fine-grained 交织更新内存。如果您将线程设计为防止并发问题,那么它们 运行 在相同 CPU 或不同 CPU 上真的无关紧要。如果线程有时在一个 CPU 上 运行,然后在另一个 CPU 上,这并不重要。线程拥有它自己的所有状态,与 CPU 运行 是哪个无关紧要。

似乎 Java 委托操作系统决定 运行 特定线程的位置。

可以在single-core上运行,但是一定要注意一个线程在读,一个线程在写。 OS(调度程序)负责内部工作。

AgilePro的回答没什么可补充的

如果您想控制哪些 CPU 运行 哪些线程,您需要将线程固定到 CPU。使用 Java.

时,您可以使用 Peter Lawrey 的 Thread Affinity library

在 Linux 上,每个线程都有一个位图,每个 CPU 允许线程 运行 上有一个位。默认情况下,所有位都已设置,这意味着线程可以在任何 CPU 上 运行。线程甚至可以从一个 CPU 迁移到另一个。但是使用某些系统调用,可以将一个线程固定到 CPUs.

的一个子集(甚至是一个)