处理器和线程的区别

4

我在使用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*可用处理器的线程?

你可以在单个处理器上运行100个线程,但它们不会同时运行:操作系统的线程调度程序将根据各种因素(例如线程优先级等)使它们依次运行和等待。 - assylias
你可以在一个单一的进程内运行 X 个线程。处理器,换句话说,就是 CPU,那里是所有操作的核心。 - Murat Karagöz
关于最大线程数,请参考此问题 - https://dev59.com/BXRA5IYBdhLWcg3w9y50 - Manish
@assylias,根据我所读的大部分文献,如果两个线程都已启动且没有一个完成,则被认为是“并发”的。按照这个定义,您可以在一台机器上拥有比处理器更多的并发线程。https://en.wikipedia.org/wiki/Concurrency_(computer_science) - Solomon Slow
@jameslarge 你说得对,我应该说“他们不会同时执行实际工作”之类的话…… - assylias
显示剩余4条评论
3个回答

2
您可以在一个进程内运行X个线程。处理器,也就是CPU,是所有操作的单元。您可以在Windows上检查资源监视器,以查看一个进程中运行了多少线程

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

但是如何找出我可以使用的线程数量,假设我的应用程序只在8个处理器的机器上运行? - nanpakal
@pppavan 请查看这个问题 https://dev59.com/BXRA5IYBdhLWcg3w9y50 - Murat Karagöz
在最近的机器上,您可以使用数百甚至数千个线程,而不会遇到限制。但这并不意味着使用如此高的数量就能获得最佳性能。例如,请参见:https://dev59.com/U2Yr5IYBdhLWcg3wQH--#13958877 - assylias

1
确定使用的最佳线程数比听起来要难得多。它始于一个问题:实际上有多少个核心处理器可用。即使您知道这一点,您仍然不知道每个核心在硬件上支持多少线程。
因此,在Java专家通讯中有几篇文章深入探讨了这个主题。
例如,这篇文章:http://www.javaspecialists.eu/archive/Issue135.html 或者关于“可用处理器数量”的最新文章:http://www.javaspecialists.eu/archive/Issue220.html 无论如何,有一些使用并行流的经验法则:
  • 了解实现正在使用某些默认值
  • 因此:监视/测量代码提供的实际结果
  • 当您不满意时:开始微调

0

你在Java应用程序中可以使用的线程数量仅受JVM或操作系统的限制。你应该区分两个事情:

  • 真正的并行性意味着你可以在同时使用8个内核的情况下运行8个线程,而不需要切换处理器上下文;
  • 伪并行性意味着你可以在单个处理器上运行8个线程,但是这个处理器将不断地从一个线程切换到另一个线程。当这个处理器执行一个线程时,其他线程将被挂起,直到操作系统使处理器运行另一个从挂起的线程中获取的线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接