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

还没有回复,快来抢沙发~

发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告