简单说一下吧!拿我们生活中非常常见的一例子来说:并不是人多就能把事情做好,增加了沟通交流成本。你本来一件事情只需要3个人做,你硬是拉来了6个人,会提升做事效率嘛?我想并不会。

线程数量过多的影响也是和我们分配多少人做事情一样,对于线程来说主要是增加了上下文切换成本。不清楚什么是上下文切换的话,可以看我下面的介绍。

当我们的线程数量配置的过大,我们的线程与线程之间有会争取 CPU 资源,这就会导致上下文切换。

多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。

概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。

Linux 相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。

上下文切换过多,必然增加线程的执行时间,影响了整体执行效率。

如果我们设置的线程池数量太小的话,如果同一时间有大量任务/请求需要处理,可能会导致大量的请求/任务在任务队列中排队等待执行,甚至会出现任务队列满了之后任务/请求无法处理的情况,或者大量任务堆积在任务队列导致 OOM。这样很明显是有问题的! CPU 根本没有得到充分利用。

线程数该配置多少呢?网上有一个比较通用的公式可以作为参考:

有一个简单并且适用面比较广的公式:CPU 密集型任务(N+1): 这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。一旦任务暂停,CPU 就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。

I/O 密集型任务(2N): 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是 2N。

java 多线程池_Java项目中,线程池中线程数量太大会有什么影响?相关推荐

  1. java线程池最大线程数_Java项目中,线程池中线程数量太大会有什么影响?

    1.线程栈是需要分配内存空间的,所以有数量上限 2.cpu切换线程涉及到上下文恢复,这个是需要耗费时间的,如果线程非常多而且切换频繁(处理IO密集任务),这个时间损耗是非常可观的. 线程池应该设置多大 ...

  2. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  3. java 多线程 任务队列_Java并发编程线程池任务队列

    类ThreadPoolExecutor最常使用的构造方法是: ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliv ...

  4. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码

    java Timer定时器 简单实例代码:public class Test { public static void main(String[] args) { // Timer定时器 Timer ...

  5. Java多线程(四):使用Executors创建线程池及其注意事项

    文章目录 1. 简介 2. newCachedThreadPool 3. newFiexedThreadPool 4. newSingleThreadExecutor 5. newScheduledT ...

  6. Java多线程(三):使用ThreadPoolExecutor创建线程池

    文章目录 1. 简介 2. 构造函数说明 3. ThreadPoolExecutor例子 4. 拒绝策略 4.1 CallerRunsPolicy 4.2 AbortPolicy 4.3 Discar ...

  7. java 多线程性能_Java中多线程的性能比较

    java 多线程性能 Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndI ...

  8. java 多线程 进程_Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  9. java多线程通信_Java多线程-线程通信

    原标题:Java多线程-线程通信 通信的方式 要想实现多个线程之间的协同,如:线程执行先后顺序.获取某个线程执行的结果等等.涉及到线程之间的相互通信,分为下面四类: 文件共享 网络共享 共享变量 JD ...

最新文章

  1. struts2之请求参数接收
  2. python numba.jit(该装饰器用于将Python函数编译为本机代码、python运算加速器)
  3. 你是PHP菜鸟,如果......
  4. C语言设计模式——命令模式
  5. react 注释html,React之JSX语法
  6. 百度编辑器ueditor字体添加
  7. bzoj 3451 Normal
  8. python 实例化对象_python如何实例化对象
  9. DXperience中文视频教程(上)
  10. 大气海洋数值模式经验总结
  11. 用html做简单的日记,学习HTML日记
  12. 论文写作,word首页脚注不显示编号
  13. python opencv 将白色底变成透明底
  14. 服务器CPU使用率过高排查与解决思路
  15. 宏正ATEN发行全新高端式IP-Based Cat 5 KVM多电脑切换器
  16. (附源码)php柘城县农产品销售网站 毕业设计 020832
  17. Gitlab CI/CD 中使用 ssh-key,登录远程主机部署,执行远程主机的特定脚本
  18. 后羿采集器怎么导出数据_后羿采集器如何采集亚马逊评论
  19. 微信返利机器人开发制作
  20. Presto 0.224个人笔记

热门文章

  1. 如何查找SAP Fiori launchpad Designer的准确路径即url地址
  2. Jerry的SAP Kyma和Kubernetes讲座的幻灯片分享
  3. SAP建议客户将UI技术迁移到Fiori的六大原因
  4. 如何启用SAP C4C OData Event Notification
  5. 为什么我的C4C Service Request没办法Release到ERP?
  6. 使用DOM Breakpoints找到修改属性的Javascript代码
  7. 机器学习模型定点化_机器学习模型的超参数优化
  8. matlab中nc文件,MATLAB读取.nc文件
  9. php打印输出小于10的数字,PHP 字符串输出 echo、print 与 printf 函数
  10. python学习-知识点进阶使用(end、while else、range、iter、list的多种遍历方式)