当前位置: 首页 > news >正文

什么时候用多线程、为什么要设计多线程?

1、为什么要用多线程?

        现在的计算机系统一般都是多核cpu的,而在任意一个时刻,每个cpu内核都能执行一个线程,所以为了利用多核cpu的优势,我们的程序也不应该只支持单线程运行,我们应该在适合的地方进行多线程编程,让程序在执行过程中,能够有机会用多个线程同时占用多个cpu内核去执行,这样能提高程序的执行效率,提升系统的吞吐能力。

2、什么时候用多线程?

        会使用到多线程的场景主要有:高并发请求的并发处理、耗时的大任务拆分成多个操作用多个线程并发执行、异步任务的处理。

        具体点来说:

        1、当我们的系统面临着高并发请求时,系统也应该用多个线程去并发处理这些请求,这是请求层面的多线程处理,web容器已经替我们做了这个实现,比如:Tomcat,Tomcat是一个用NIO来实现的高性能的http服务器,它会不断监听客户端请求,当channel上发生了客户端请求事件时,它会将这个事件封装为一个任务交给它所维护着的线程池去处理。

        2、当我们有一个耗时大任务是由多个操作组成的,而这多个操作即便是并发执行也不会产生相互影响,不会导致数据不一致的问题发生,那么这个时候我们也可以用多线程进行并行处理。如:某个方法中包含了三个耗时的io操作,分别为读取文件A、B、C,三个读取操作分别耗时10ms、15ms、10ms,如果用单线程去执行这个方法,那总耗时为35ms,如果用三个线程并行执行这三个io操作,那么总耗时只有15ms,大大提升了执行性能。

        3、当我们有一个非常重要的功能,而在这个功能内部又包含了一个不太重要却又非常耗时的操作,并且这个操作的结果不会对当前功能的主要业务逻辑产生影响,这个时候,我们就可以将这个操作封装为一个任务提交到线程池去处理,提交后当前线程即可返回。如:网站的注册功能,注册成功之后要给用户发邮件,邮件是否成功发送并不影响注册逻辑,发邮件的操作就可以交给线程池处理。

        总之,使用多线程的前提是多核cpu,让多线程并发也是为了充分利用多核cpu,在单核cpu服务器上运行多线程程序是没有意义的,因为有再多线程,cpu内核也只有一个,同一时刻,只能有一个线程的一条指令能得到执行。在多核cpu服务器上运行多线程程序时,线程数量也不是越多越好,因为:1、每创建一个线程对象,jvm都要为它分配栈内存和程序计数器,越多的线程带来的内存开销越大,还有可能因线程创建过多而抛出OOM异常;2、当内存中线程数量达到一定的值之后,再去创建线程反而会带来CPU性能下降,因为多个线程是轮流获取到cpu的执行权,线程之间存在上下文切换,而线程的上下文切换是非常消耗cpu的一个操作,太多的线程会导致上下文切换太频繁,所以我们应该用线程池去管理线程,控制好线程数量,以达到cpu的最高利用率。

相关文章:

  • JVM高频面试题(2023最新版)
  • rocky linux9 安装go 即接下去
  • 单元测试实战
  • devops使用
  • 为实体服务器配置Ubuntu
  • 【IO】IO模型与零拷贝
  • html table+css实现可编辑表格
  • 理解SpringMVC的工作流程
  • 【宇宙猜想】AR文创入驻今日美术馆、北京天文馆等众多展馆,在AR互动中感受科技魅力!
  • 软件工程快速复习(期末急救)
  • 国内前十大连锁酒店集团之一『东呈集团』商城项目启动,企企通赋能酒店管理集团采购数字化
  • 软件工程期末复习
  • SpringMVC系列之技术点定向爆破一
  • 怎么实现Servlet的自动加载
  • Hive-数据模型详解(超详细)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【知识碎片】第三方登录弹窗效果
  • docker容器内的网络抓包
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript实现分页效果
  • jquery ajax学习笔记
  • JS+CSS实现数字滚动
  • js写一个简单的选项卡
  • nginx 配置多 域名 + 多 https
  • PAT A1050
  • Python实现BT种子转化为磁力链接【实战】
  • React系列之 Redux 架构模式
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何正确配置 Ubuntu 14.04 服务器?
  • ​io --- 处理流的核心工具​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (06)Hive——正则表达式
  • (11)MATLAB PCA+SVM 人脸识别
  • (2)(2.10) LTM telemetry
  • (4.10~4.16)
  • (生成器)yield与(迭代器)generator
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十五)使用Nexus创建Maven私服
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Framework杂记
  • .net 验证控件和javaScript的冲突问题
  • .net6+aspose.words导出word并转pdf
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET中两种OCR方式对比
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/motd and /etc/issue
  • ??在JSP中,java和JavaScript如何交互?
  • @Autowired和@Resource的区别
  • @RunWith注解作用
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)