多线程之浅谈线程概念
要学习一个技术我们首先是要理解其本质的定义,只有这样的前提下你才能更快更准确的去学习和使用他,为了更好的去学习多线程我们必去先 明白什么是线程,我将会依依说明为什么要依次理解的原因。
首先们我来看看2个w一个h的问题,
1什么是多线程?
2为什么要用多线程?
3怎么使用多线程?
第一个问题的官方回答是:
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。从简单的文字的定义上看,好像就是同时做“多件事”,而实际情况就是这样,只是它里面还有更多要注意的细节和有趣的事情。
在聊聊第2个问题,标准回答是:
1.耗时的操作使用线程,提高应用程序响应
2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3.多CPU系统中,使用线程提高CPU利用率
4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独
立的运行部分,这样的程序会利于理解和修改。
以上对这两个问题的回答比较的生硬和官方,我个人并不喜欢这样的回答,因为不能“个性本地化”的理解,我认为上述的前两个问题应该是一个问题,而要回答这个问题我们来聊聊多线程的历史。
简单来说任何技术都是来满足人类“惰性”的欲望,多线程也不例外,1960就开始有了多线程的思想,为了便于理解请看一个例子:
小明每天早上6点从起床到去上学6点半需要做以下事情:1起床穿衣 2洗漱 3早餐,4唱歌(不去管为什么要唱歌),而有一天他6点10分才起床为了不迟到他想到把唱歌这件事在穿衣服的时候可以一起做,这样在同一时间去做两件事就可以缩短时间。
这个例子就能很好的演示多线程思想的诞生,就是为了提高效率,缩短做事的时间,这就其实很好的解答了第2个问题,而一个技术的本身的特性跟它所需要解决的问题是分不开的,可以这么说需求决定了一个技术的特性,什么是多线程?就是并发运行多个线程,而这个问题的关键是又引发了一个问题,那什么又是线程?从上面的小明的例子来看,我们可以确定的是线程一定有两个重要的因素:1任务 2时间 ,小明需要做的每一个事情就是一个任务,要完成这些任务一定有一个时间段(不管这个时间段的长短),我们再来看看官方对线程的定义和组成:
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
对于这个定义我并不是很喜欢因为他是从程序的单位大小去说明,相对而言我觉得这么说更好些:
线程是指程序的一个指令执行序列!
没错,线程就是多个任务按一定的顺序去排列执行,这就像一个编剧写好了一个剧本(任务),导演和演员去实现这些剧本的情节,而拍出来的电影就是线程,这里大家有没发现一个很有趣的本质,电影其实就是把N个镜头按顺序播放,那剧本和电影有什么本质区别?或者说说任务和线程有什么区别?这个问题很多人都分不清,就连think in java的作者也说自己当初经常分不清楚两者的区别,我认为它们的区别在于:时间。如果没有时间那么任务就没法执行,电影也没法拍摄,要深刻的理解这点很重要,因为基本的概念理解决定你对技术本身的使用方式。
而后面也解释了线程的组成,这里我简单的说明,在后面我会专门开一片线程组成的深入研究,线程id就像一个人的身份证一样这个就不说了,指令指针就是我们理解的“任务”(这里暂且这么理解),寄存器集合和堆栈就是拍电影的“场地”。
要回答最后一个问题有一个前提:那就是你会使用线程,在这前提下还有一个前提是:你知道什么是线程。所以要回答最后这个问题这将是整个多线程系列最终要回答的问题。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/breaknull/article/details/47836713