要学习一个技术我们首先是要理解其本质的定义,仅仅有这种前提下你才干更快更准确的去学习和使用他。为了更好的去学习多线程我们必去先 明确什么是线程。我将会依依说明为什么要依次理解的原因。
首先们我来看看2个w一个h的问题,
1什么是多线程?
2为什么要用多线程?
3怎么使用多线程?
第一个问题的官方回答是:
多线程(英语:multithreading)。是指从软件或者硬件上实现多个线程并发运行的技术。从简单的文字的定义上看,好像就是同一时候做“多件事”,而实际情况就是这样,仅仅是它里面还有很多其它要注意的细节和有趣的事情。
在聊聊第2个问题,标准回答是:
1.耗时的操作使用线程,提高应用程序响应
2.并行操作时使用线程。如C/S架构的server端并发线程响应用户的请求。
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就像一个人的身份证一样这个就不说了,指令指针就是我们理解的“任务”(这里暂且这么理解)。寄存器集合和堆栈就是拍电影的“场地”。
要回答最后一个问题有一个前提:那就是你会使用线程,在这前提下另一个前提是:你知道什么是线程。所以要回答最后这个问题这将是整个多线程系列终于要回答的问题。