线程池创建多少线程比较合理?

原文:https://www.cnblogs.com/karlMa/p/11356041.html

  在设置线程池线程个数的时候,经常会想到这个问题,是不是设置的线程数越多越好?理解这个问题之前我们要先清楚的知道我们为什么使用多线程。

为什么会使用多线程

  使用多线程的主要目的我们应该都能回答的出来,就是提高程序的性能,这个提高性能其实是指,“降低延迟”:指发送请求到接收到数据的时间,和“提搞吞吐量”:单位时间能可以处理更多的请求。

  将近延迟和提高吞吐量对应的方法有两种: 优化算法 和 将机器的硬件性能发挥到极致。

  1. 优化算法:降低时间和空间复杂度,使的程序执行时间更短。

  2. 将硬件的性能发挥到极致,具体的指提高I/O 和cpu的利用率。

  如何提高I/O 和CPU的利用率的举例: 如果单核系统中,只有一个程序执行又有IO操作和CPU计算的代码,当程序执行IO操作的时候,CPU其实是空闲的,反之IO是空闲的,如果这个时候用两个线程去跑这段代码,一个线程执行IO操作 ,一个线程执行CPU计算 ,这时IO和CPU的利用率是不是发挥了极致?

创建多少线程比较合适?

  经过上面的分析,我们知道创建多少线程能够将硬件的利用率达到最高才是最好的线程数。

  我们从线程的应用场景来分析, 由于IO操作比CPU计算耗时要久的多的,如果我们一段程序有IO操作和CPU计算 我们可以称之为:IO密集型计算。 程序中没有IO操作,只有CPU的话,称之为CPU密集型程序。

  1. IO密集计算,如何将硬件利用率达到极致呢 我们将 R = IO耗时 / CPU耗时 我们从上面的例子来看 如果IO耗时/CPU耗时 = 10 (我们平常可以用工具apm来统计这个比例) 创建线程A 执行io操作 我们希望IO操作的时候 CPU不能闲着 所以就应该创建10个线程去执行CPU计算 当Io操作完毕后刚好CPU也执行完毕 ,他们的利用率都是百分之100 在执行这段代码的时候。这个例子我们要创建 1+ 10 = 11个线程执行起来效率更高,于是我们就得到了公式: 1+ I/O耗时/CPU耗时,如果是多核CPU最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / CPU耗时)

  2. CPU密集型,这个就很简单了 CPU的核数 = 线程数就行,一般我们会设置 CPU核数+1 防止由于其他因素导致线程阻塞等。

原文地址:https://www.cnblogs.com/huanshilang/p/12095161.html

时间: 2024-10-12 03:32:43

线程池创建多少线程比较合理?的相关文章

java中线程池创建的几种方式

java中创建线程池的方式一般有两种: 通过Executors工厂方法创建 通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)自定义创建 Executors工厂方法创建 package com.javaBase.LineDistancePond; import java.util.

深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]

线程池数据结构与线程构造方法 由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构.图1描述了这种数据结构. 图1 ThreadPoolExecutor 数据结构 其实,即使没有上述图形描述ThreadPoolExecutor的数据结构,我们根据线程池的要求也很能够猜测出其数据结构出来. 线程池需要支持多个线程并发执行,因此有一个线程集合Collection<Thread>来执行线程任务: 涉及任务的异步执行,因此需要

Java多线程系列--“JUC线程池”03之 线程池原理(二)

线程池示例 在分析线程池之前,先看一个简单的线程池示例. import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; public class ThreadPoolDemo1 { public static void main(String[] args) { // 创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThre

深入浅出 Java Concurrency (34): 线程池 part 7 线程池的实现及原理 (2)[转]

线程池任务执行流程 我们从一个API开始接触Executor是如何处理任务队列的. java.util.concurrent.Executor.execute(Runnable) Executes the given task sometime in the future. The task may execute in a new thread or in an existing pooled thread. If the task cannot be submitted for execut

Java多线程系列--“JUC线程池”04之 线程池原理(三)

本章介绍线程池的生命周期. 线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态.线程池也有5种状态:然而,线程池不同于线程,线程池的5种状态是:Running, SHUTDOWN, STOP, TIDYING, TERMINATED. 线程池状态定义代码如下: /** * The main pool control state, ctl, is an atomic integer packing * two conceptual fields * workerCount, indi

线程池和异步线程

目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程 5 异步线程的工作过程和几个重要的元素 6 有必要简单介绍下Classic Async Pattern 和Event-based Async Pattern 7 异步线程的发展趋势以及.net4.5异步的简化 8 本章示例 自定义一个简单的线程池 Asp.net异步IHttpAsyncHandler示例 9 本章总结 1 什么是CLR线程池? 在上一章中

Java多线程系列--“JUC线程池”02之 线程池原理(一)

ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许同时运行的线程数量就是线程池的容量:当添加到线程池中的线程超过它的容量时,会有一部分线程阻塞等待.线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理." ThreadPoolExecutor数据结构 ThreadPoolExecutor的数据结构如下图所示: 各个数据在ThreadPoolExecutor

Java多线程系列--“JUC线程池”01之 线程池架构

概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构图线程池示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行

使用线程池与专用线程

高效线程使用圣典 严格来讲,线程的系统开销很大.系统必须为线程分配并初始化一个线程内核对象,还必须为每个线程保留1MB的地址空间(按需提交)用于线程的用 户模式堆栈,分配12KB左右的地址空间用于线程的内核模式堆栈.然后,紧接着线程创建后,Windows调用进程中每个DLL都有的一个函数来通知进程 中所有的DLL操作系统创建了一个新的线程.同样,销毁一个线程的开销也不小:进程中的每个DLL都要接收一个关于线程即将"死亡"的通知,而且内核对象 及堆栈还需释放. 如果一台计算机中只有一个C