java - 处理器和线程之间的区别

标签 java multithreading cpu java-threads

<分区>

我正在使用 java 8 的并行流,但我不明白一件事:

我有一台有 8 个处理器的机器......

IntStream.range(0, 9).parallel().forEach(i -> {
    int cnt = 0;
    while (System.currentTimeMillis() < runUntil)
        cnt++;
    System.out.println(i + ": " + cnt);
})

这是否意味着我只能使用 8 个线程?

上面的代码并行运行 8 个,下一个将等待,但如果我使用使用 ForkJoinPool 的自定义线程池,则 8 个以上的任务将并行运行。

ForkJoinPool forkJoinPool = new ForkJoinPool(17);
forkJoinPool.submit(()->IntStream.range(0, 17).parallel().forEach(i ->
{
    int cnt = 0;
    while(System.currentTimeMillis() < runUntil)
        cnt++;
    System.out.println(i + ": " + cnt);
})).get();

上面的代码只并行运行了16个。如果我可以在 8 处理器机器上使用超过 8 个线程,我可以使用的最大线程数是多少。

编辑 1 - 这是否意味着我们可以使用的最大线程数是 2* 可用处理器的?

最佳答案

您可以在一个进程 中运行X 数量的线程Processor 换句话说 CPU 是所有运行的单元。您可以检查 Windows 上的 Resource Monitor 以查看有多少 Threads 在一个 Process 中运行。

例如 Chrome 浏览器运行在三个进程中,分别有 20 个线程。换句话说,您可以在 CPU 功率/内存等允许的情况下启动尽可能多的线程

关于java - 处理器和线程之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304607/

相关文章:

java - Mockito:检测何时调用私有(private)资源上的方法

java - 获取非 Spring Java 应用程序的详细 Metrics 数据

独立 std::threads 的 C++ std::vector

c++ - 可以从非父线程调用 std::thread::join() 吗?

Php CPU 周期基准测试

java - Spring Boot 在部署到 Tomcat 期间无法加载外部 jar

java - 在分形的 Paint() 方法中使用递归

linux - 向父进程的另一个线程中生成的子进程发送 TERM 信号

Python 的 sleep() CPU 使用率

performance - EC2机器或网络有什么限制吗?