处理器和线程之间的区别

时间:2017-07-25 13:19:51

标签: 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 *可用处理器?

3 个答案:

答案 0 :(得分:2)

您可以在一个Threads内运行X-amount Process。一个Processor换句话说CPU是它全部耗尽的单位。您可以查看Windows上的Resource Monitor,了解Threads中有多少Process正在投放。

例如,Chrome浏览器分别在三个进程中运行,同时分别有20个线程。换句话说,您可以像CPU电源/内存等允许的那样启动Threads

答案 1 :(得分:1)

确定要使用的最佳线程数实际上比听起来更难。它首先提出了有多少内核,处理器实际可用的问题。即使你知道这一点 - 你仍然不知道每个核心将在硬件中支持多少个线程。

因此:有一些关于java专家通讯的文章对这个主题进行了深入研究。

例如这一个:http://www.javaspecialists.eu/archive/Issue135.html

或一个非常新的,可用处理器的数量&#34;:http://www.javaspecialists.eu/archive/Issue220.html

在任何情况下,使用并行流都有一些经验法则:

  • 了解该实现正在使用某些默认值
  • 因此:监控/衡量您的代码提供的实际结果
  • 当你不开心时:开始微调

答案 2 :(得分:0)

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

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