我正在使用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 *可用处理器?
答案 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或操作系统的限制。你应该区分两件事: