你一定听说过多线程吧?它有什么好处?主要用于什么场景?
如果你的程序响应迟钝,请考虑多线程。
如果你的程序效率不高,请考虑多线程。
如果你的程序吞吐不高,请考虑多线程。
多线程是有效提升程序运行效率的方式之一(还有可能是优化算法,提高硬件配置,分布式计算,网格计算等等等等)。
什么是多线程?还是从简单的例子入手
在中国,你一定见过这道题:“一个水箱有5个排水孔,打开一个排水孔,水箱清空需要一小时,请问怎样才能使水箱迅速清空,并计算清空的时间?”
这个耳熟能详的应用题就蕴含了多线程的原理,以前我们讲过,线程是程序执行的最小单位,也就是只有当你是一个线程的时候,你才有机会获得CPU的临幸,给你一个小段的时间,让你来执行。一个排水孔就是一个线程,当打开一个排水孔的时候,称为单线程程序。当打开多个排水孔的时候,称为多线程程序。因为一个程序有更多的线程,那么这个程序中的多个线程获得CPU的几率就更高,获得的时间就更多,所以执行速度也会更快。
获得CPU的专业术语叫获得时间片,也就是CPU把所有的时间分成若干个小片,把每一个小片不断的分给不同的线程来执行,保证每个程序都有机会执行,不会有程序一直霸占CPU。
你手机上的微信虽然一直在前台运行,但是没有霸占CPU好吗。其实整个操作系统是相当三心二意的,不会一直对一个程序情有独钟。看起来一直霸占,其实还是有很多时间片被分配给了其他的应用程序,只不过这个轮询的过程非常快,你根本感觉不到而已。你一边打开Word编辑文档,一边打开了QQ音乐听着歌,其实是CPU的时间片不断的在两个程序之间分配,中间可能也有一个时间片其实word或QQ音乐程序是停止的,只不过人类无法感知而已。
所以多线程程序的核心是开启更多的线程,获得更多的CPU时间片,让程序更快完成而已。
在一个GUI(也就是有界面,有用户交互)的系统中,比如Android、iOS、Windows等等,其实操作系统本身的设计就是多线程的。其中至少有两个线程,一个叫主线程,另一个叫工作者线程。
主线程一般是用来绘制界面,响应用户操作的(比如触摸、滑动、点击),这个线程最好不被应用程序所打扰,因为它最好保持很高的实时性,要不用户就会骂卡。。。顿。。。慢。。。(所以如果你的App一直感觉卡卡的,要细致检查下了哦,是不是在主线程里面干了什么小羞羞的事情)。
工作者线程,顾名思义,是用来运算或者完成逻辑的,它对用户界面和操作不负责响应,它就一个字“干”,默默的做计算,做逻辑,并将一些结果反馈给主线程,从而展示不同的用户界面和逻辑。
多线程系统无处不在,下面说几个小例子。
你现在所看到的所有的下载器(迅雷、旋风、浏览器自带的下载),都是多线程实现的,如果单线程的话,下载速度最多是别人的一半(哎呦~,人家三个以上的线程在同时下载数据并写到磁盘哦,当然干不过人家)
后台的服务器系统都是多线程的,如果是单线程的,我在访问的时候,占用了CPU,别人就访问不了了哦,这个就是并发的意思,以后有机会,给大家讲讲并发和均衡负载,oh yeah~
你所见到的任何一个app,其实启动的时候都做了大量的事情,都是多线程的,有的线程可能在加载新模块,有的线程在做上报,有的线程在收集lbs信息
总结,多线程有两层含义,第一层是开启多个线程做不同的事情,这种主要是为了并发同时做很多事情。第二层是开启多个线程做同一个事情(比如开始举的放水的例子),这种是为了效率更高。
多线程也有弊端,就是多个线程的时序不好控制,多个线程之间的共享变量控制难度比较大,多线程通知机制复杂,且调试困难,多线程编程,是一名优秀程序员的自我修养,也是提高程序运行效率的利器之一。
如果一个牛逼哄哄的程序员说,这里无法再优化了,你不妨轻轻的问下:“如果多线程的话,能提高这里的效率嘛”,很可能还有意外收获哦。
登录 | 立即注册