CPU密集型和IO密集型对 CPU内核之间的关系

多线程如何合理的配置核心线程数?

对于 CPU 密集型任务,由于 CPU 密集型任务的性质,导致 CPU 的使用率很高,如果使用线程池中的核心线程数量过多,会增加上下文切换的次数,带来额外的开销。因此,考虑到 CPU 密集型任务因为某些原因而暂停,这个时候有额外的线程能确保 CPU 这个时候不会浪费,还可以增加一个 CPU 上下文切换。

一般情况下:线程池的核心线程数量等于 CPU 核心数 + 1。例如需要大量的计算,视频渲染,仿真等等。这个时候 CPU 就卯足了劲运行,这个时候切换线程,反而浪费了切换的时间,效率不高。打个比方,你的大脑是 CPU,你本来就在一本心思地写作业,多线程这时候就是要你写回作业,然后敲会代码,然后在看个视频,然后在切换回作业。

对于 I/O 密集型任务,由于I/O 密集型任务 CPU 使用率并不是很高,可以让 CPU 在等待 I/O 操作的时候去处理别的任务,充分利用 CPU。

一般情况下:线程的核心线程数量等于 2*CPU 核心数。例如你需要陪小姐姐聊天,还需要下载一个 IDEA,还需要看博客。打个比方,小姐姐给你发消息了,回一下她,然后呢?她给你回消息肯定需要时间,这个时候你就可以下载 IDEA,下载完一看,她还没有回消息,然后看会博客。小姐姐终于回你了,你回一下,然后接着看博客,这就是类似于 I/O 密集型。你可以在不同的“不烧脑” 的工作之间切换,来达到更高的效率。而不是小姐姐不回你,你就干等着,说不定,小姐姐根本不会回复你。

对于混合型任务,由于包含 2 种类型的任务,故混合型任务的线程数和线程时间有关。在某种特定的情况下还可以将任务分为 I/O 密集型任务和 CPU 密集型任务,分别让不同的线程池去处理。

一般情况下:线程池的核心线程数 = (线程等待时间/线程 CPU 时间 + 1) CPU 核心数*。

你可能感兴趣的:(JAVA,java,开发语言)