一、是什么?
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。
一般而言,多线程的应用,主要解决的是吞吐量(单线程,处理一个请求,多线程,处理多个请求。同一时间,可以处理多个用户的请求)、伸缩性(现在的计算机,估计很少再有那种单核的了吧,然后,如果一直使用单线程操作,那么多的那几核,岂不浪费)的问题
二、为什么使用?
说到这个为什么使用的问题,由于个人经验所限,没有很深入的理解。但是,说到这个多线程,就想起了当年浩浩汤汤参加软考大军的时候的一个名词:指令流水线。个人认为,用指令流水线去理解这个多线程,从这儿建立一个知识的结点,是再合适不过了。
流水线:是指在程序执行时,多条指令重叠运行操作的一种准并行处理技术。(多条指令重叠运行,是不是和多线程有共通之处呢?指令流水线的主要作用就是提高了系统的吞吐量和各部件的利用效率和执行速度)
先看两个图(不使用和使用流水线的系统指令时空图):姑且,用这个去理解单线程和多线程的区别吧,额,这姑娘很懒,直接从当年软考的书上拍了两张图
从图上可以看出,不使用流水线(多线程)的时候,起码从时间上来说:T(总)=T1+T2+...+T(n);而相反,使用了流水线(多线程)的时间:T=T(最慢)
三、用到哪儿?
从第二点得到点个人启发,就是关于多线程的启用时机或者说是应用场景。一家之谈,仅供参考或者娱乐
说到这个用到哪儿的问题,准确的说,不是说具体应用到的领域或者场景,而是,在什么情况下,可以考虑启用多线程来进行性能优化。那么,可能很多人都听过搬10个箱子的故事(我的同胞们,肯定是听过的哈,我都还是被告诉的呢),就是说,现在1楼有10个箱子,如果是单线程的话,就是用1个人,搬10次。如果用多线程的话,就是用5个人,搬2次,更甚至是用10个人,搬一次。从这里,可以看出的是:任务,是可以被划分的。
总结说来(再次声明,一家之言),满足以下两点的时候,可以考虑启用多线程技术:
1,任务可被划分(比如说最早期做的机房收费系统,当然那时候还不懂多线程哈。当在执行注册的时候,会基本上有两个主要的任务:写入学生表数据,写入卡表数据,写入充值表数据,当然,这时候,又隐约涉及到了事务问题。额,咱先说线程问题)
2,任务可被重叠执行(还拿机房收费系统说事儿吧,前面说注册,这回说注销。当在执行退卡操作的时候,主要的任务有:查询是否上机,写入退卡记录信息。这2个主要的任务,很明显第2个是建立在第一个的结果基础之上的。当然多线程也可以互相通信或是获取执行结果,比如说那个Callable和Future。但是,姑且考虑一下,这个情况下,启用多线程,真的不会出问题吗?真的不会吗?)
再来说,当满足了这两个条件,就要启用多线程吗?且看下面一组例子:
情况一:程序--------------------------------------------开始
1,读取第一个文件信息 1 S
2,处理第一个文件信息 2 S
3,读取第二个文件信息 1 S
4,处理第二个文件信息 2 S
程序--------------------------------------------结束
OK,多线程3S VS 单线程6S,完胜
情况二:程序--------------------------------------------开始
1,读取第一个文件信息 1 S
2,处理第一个文件信息 2 S
3,读取第二个文件信息 20 S
4,处理第二个文件信息 1 S
程序--------------------------------------------结束
OK,多线程21S VS 单线程24S , 各位看官,这次的结果是什么呢?(提示:线程的调度)我想,这时候,最好的优化方式,不是启用多线程,而是启用缓存去缓存第二个文件的读取结果。
PS:话说,看到后面的这一组例子,有没有想到操作系统里面的移臂调度啊和什么高速缓存区之类的啊?额,下次再谈!
四、总结
关于多线程的应用场景问题,自己就先总结到这儿了,启用多线程的时候,还得注意资源争夺问题,也就是传说中的死锁问题。第二点,个人感觉,还得考虑一下,响应中断的问题。下一篇博客再接着总结吧,话说,看到这个多线程的时候,真的想回去再来一次软考,再考几次操作系统概论、数据结构与算法啥的。真幸运,上次的数据结构与算法没有考过,今时不同往日,这次考试数据结构与算法,已经完全和考试没有关系了!