工作中一直忙着实现业务逻辑,多线程接触得不多。对多线程的认知,一直停留在Thread和Runnable上。最近心血来潮,找了几本多线程的书,不看不知道,一看吓一跳。原来我对多线程的理解是多么的肤浅。记录一下所学,以加深印象。
         线程越多,是不是处理起来就越快呢?举个例子,男人(CPU),老婆(线程),那问题可以转换成:是不是老婆越多越好?答案相信大家心中有数。什么?你觉得老婆越多越好?虽然你可能有一夜七次郎的能力,但是你有49个老婆的话,每人一周只有一次。老婆们就会出现问题的。皇帝(一个CPU)却有后宫佳丽3000(3000个线程),他照顾不过来的。
         好,既然线程不是越多越好,那么开多少个线程才合适呢?这我们得分情况看,我们把计算机要完成的事情称为任务。那么任务可以分为两种:
         1.  计算密集型
               是指纯粹CPU计算比较多的任务。比如:求 1000000 以内所有的素数。这种任务我们基本只需要开和CPU个数相同的线程就可以了。线程多了,CPU对线程的调度次数也就多了,这都是要花时间的,这些时间也是不必要的。CPU本就处于忙碌状态,你还让它切换来切换去,这不是没事还找事么? 如果有多个CPU,还需要考虑平衡分配给各个CPU的任务,不能说这个CPU早就完成任务了,另外一个还有很多任务没完成。 假设你的老大分配给你的任务是别人的10倍,你是啥样的心情啊?
         2.  IO密集型
               是指IO操作比较多的任务。比如读写文件、读写网络流。这些都是比较慢的操作,CPU有较长的空闲的时间,我们就需要开高于CPU个数的线程,让CPU不要闲着。具体开多少个线程,还需根据实际业务情况,多进行测试,找到一个合适的值。

最新文章

  1. SqlServer SET IDENTITY_INSERT ON | OFF
  2. x01.os.19: linux 0.0
  3. 为自己搭建一个鹊桥 -- Native Page与Web View之间的JSBridge实现方式
  4. 中间件(middlebox)
  5. android: 使用通知
  6. STL Iterators
  7. 十六、Android 滑动效果汇总
  8. shell编程基础(2)---&&与||
  9. COJ 0016 20603矩阵链乘
  10. 嵌套iframe中的HTML的文档解析类型
  11. xjoi 2082: 小明的序列
  12. 【渗透课程】第一篇-Web渗透需要接触的语言
  13. spark2.1:在RDD[unit].foreach(s=>{})内部调用sparkSession对象抛出NullPointException
  14. git 入门教程之本地和远程仓库的本质
  15. element-ui upload组件上传
  16. linux基础之用户和组管理及权限
  17. WDA基础一:激活相关服务
  18. An ac a day,keep wa away
  19. 实战c++中的vector系列--知道emplace_back为何优于push_back吗?
  20. PAT——1005. 继续(3n+1)猜想

热门文章

  1. CF148D. Bag of mice(概率DP)
  2. 设置ubuntu默认输入python进入python3
  3. HDU - 1495 非常可乐 【BFS】
  4. 调用jersey发布的接口webservice,通过HttpPost传递文件
  5. java.sql.SQLException: Access denied for user 'somebody'@'localhost' (using password: YES)
  6. BZOJ 1638 [Usaco2007 Mar]Cow Traffic 奶牛交通:记忆化搜索【图中边的经过次数】
  7. python- 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
  8. tensorflow实现svm iris二分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)
  9. Apache Flink vs Apache Spark——感觉二者是互相抄袭啊 看谁的好就抄过来 Flink支持在runtime中的有环数据流,这样表示机器学习算法更有效而且更有效率
  10. BaseAdapter/AsyncTask/..等等细节