浅谈多线程

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

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧