前言:

面试官:多线程和单线程哪个快?
我凭借微弱的记忆以及正经分析回答:多线程快,因为可以执行多个任务,而单线程只能执行一个任务。
面试官:无论什么情况多线程都比单线程快吗?
我犹豫了一下正经回答:不是的,线程执行消耗的是cpu的,cpu资源是有限的,所有不是一直比单线程快。
面试官:那什么情况下单线程比多线程快?
我…:这…不清楚。
面试官:你没有学过《计算机基础》吗?你已经自相矛盾了…
我:没学过,好吧,我不知道。
后来这个面试官变成了我的老大,技术总监,进公司第一天下午讨论某问题之后单独叫我谈话。
老大问我那个问题有没有去了解过。
我虚了:我看了,不一定,多线程存在上下文切换。
老大:多线程一定比单线程慢,上下文切换你知道什么意思吗?
我心想完了:额…看了忘记了。
然后噼里啪啦跟我解释,我现在依旧忘记了…

正文:

回家后我再次查阅资料:

首先分配cpu资源的单位是进程。一个进程所获得到的cpu资源是一定的。程序在执行的过程中消耗的是cpu,比如一个单核cpu,多个线程同时执行工作时,需要不断切换执行(上下文切换),单个线程时间耗费更多了,而单线程只是一个线程跑。
比如:
处理10个报表,
在单线程的情况下,假如说我们生成10个报表文件需要1个小时。
单线程是先执行完第一个报表,用了6分钟,再执行第二个报表,也用6分钟。总计1个小时
多线程,是10个报表一起执行,但是每一个报表都要1个小时。
总结:多线程的总体执行时间和单线程是一样的,但是多线程中单个线程的执行时间是单线程的多倍。
多线程提高的是并发数量,比如现在有一个4核cpu的服务器,同一时间可执行4个线程,这样处理线程任务的速度比较快。但是多出来的线程,5个,6个,7个,多出的线程还是要等待。

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

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

后记:

基础不牢固的情况下去回答问题是非常容易打脸的,回答出的答案也是稀里糊涂的,稍微换个角度攻击就会一脸懵逼,学习更多的新技术其实没太大用处,因为这个行业技术迭代的很快,基础才是永久的饭碗,所以我决定从java虚拟机开始入手,修炼内功,找对方向获得会更多!

多线程为什么跑的比单线程还要慢?!相关推荐

  1. 【java多线程】多线程为什么跑的比单线程还要慢?!

    问:多线程是不是能加快处理速度? 解析: 在使用多线程时,一定要知道一个道理:处理速度的最终决定因素是CPU.内存等,在单CPU(无论多少核)上,分配CPU资源的单位是"进程"而不 ...

  2. Problem 58 怎样判断当前程序链接的是多线程版的Glibc还是单线程版的Glibc?

    Problem58 怎样判断当前程序链接的是多线程版的Glibc还是单线程版的Glibc? Ans: 在Linux程序设计当中,如果一个程序被设计成可以支持单线程或多线程的模式,可以当过弱引用的方法来 ...

  3. 多线程不能不知道的之单线程和多线程的比较

    早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候. 栗子 ...

  4. redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭

    2019年的 RedisConf 比以往时候来的更早一些,今年会议时间是4月1-3号,仍然是在旧金山鱼人码头Pier 27.恰逢今年是 Redis 第10周年,规模也比以往大一些,注册人数超过1600 ...

  5. java 单线程改多线程_帮我把单线程的程序改成多线程JAVA,急!

    /*SocketServer.java*/importjava.awt.*;importjava.awt.event.*;publicclassSocketServerextendsFrameimpl ...

  6. python多线程效率低_Python 多进程、多线程效率比较

    Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程.本篇来作个比较. 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 ...

  7. 【大厂面试】面试官看了赞不绝口的Redis笔记

    文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...

  8. 单线程和多线程的优缺点(转)

    多线程处理的优点 同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低.如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应.多线程处理可 ...

  9. 什么是单线程和多线程,单线程与多线程的区别

    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的 ...

最新文章

  1. 构建插件式的应用程序框架(八)----视图服务的简单实现(ZT)
  2. 如何理解依赖注入(DI)
  3. spss预测变量重要性不可用_C4.5/5.0的SPSS操作
  4. nGQL中vid值过长被截断的处理方法
  5. Distributed Systems笔记-NFS、AFS、GFS
  6. 激动,新手第一次小试oracle的存储过程
  7. 使用 Spring 2.5 注释驱动的 IoC 功能
  8. 机器学习里的kernel是指什么?
  9. 华硕 WL-566gM之信号强度
  10. OpenOCD 依赖的deb包
  11. java run() 返回值_java线程的run()没有返回值怎么办?
  12. intelliJ idea 激活和配置
  13. esp8266 米家_【保姆级教程】米家全屋智能家居避坑指南+新手必购单品推荐(2020版)_智能家居...
  14. ASP.NET MVC Json() 处理大数据异常解决方法 json MaxJsonLength
  15. Android TextView 文字居中
  16. 围棋打谱软件 android,MultiGo(围棋打谱工具)
  17. javascript中(function(){})($)与$(function)的区别
  18. ★RFC标准库_目录链接
  19. 90后绝对不是用来管的!
  20. logo制作软件 Ai怎么设计创意LOGO

热门文章

  1. Hadoop之金庸江湖人物关系网分析
  2. “船式”可以锻炼腹肌啊
  3. Oracle 强制中止正在执行的SQL语句
  4. 基于VC++6.0开发俄罗斯方块(五)
  5. HelloWorld--JAVA程序
  6. 辽宁 viewpro.php,辽宁省策划学会赴沙地沟村考察
  7. 数字逻辑——触发器的选用和使用注意事项
  8. 软件工程技术专业的大一新生们,咱们一起讨论一下如何学好这门专业罢(喜
  9. 中关村回收贩曝黑幕:翻新一部iPhone4可赚2000元
  10. fla文件中切记不能使用TLF文本