此文要解决两个问题: 一是什么是线程;一是ANDROID与线程的关系或者说ANDROID的四大组件与线程的关系。
一台计算机,可以拥有一个CPU,也可以拥有两个CPU或N个CPU,并且一个CPU也可以拥有N个核,再者一个核还可以拥 有N个“线程”或“超线程”。ANYWAY,,对运算资源的封装其实从硬件级别就已经开始了, 并且还不只封装了一层. 姑且把它也看作N层吧.
操作系统大都在运算资源的封装上做的并不多。 进程可视为仅对内存的封装或打包以向上提供服务。事实上,在核心的操作系统理论中,并没有线程这一说。好像操作系统并不关心或者说从来就没有关心过处理器资源的处理,原因可能是它一直把这视为CPU的工作或硬件的工作,而它的工作仅是或者说一直只是,把CPU用起来!
线程的起源到底是怎样的我没有做过调查。或者说,在最初的计算机上,其实进程就是线程。现代意义上的线程其实更多的意义并不在真正的线程或者说这里要讨论的线程,而是一种对内存与处理器资源的剥离处理。即,通过线程这个概念的提出,使得对于计算机内存与处理器资源的分别处理成为可能。
无论如何,现代意义上的线程,其真实的含义更多的是指,或者说更纯洁的指,处理器资源的一种封装。与此同时,进程更多的被视为对内存资源的一种封装。虽然从更高一层的意义上看,也可以被看为一种对于状态的分开。但是仁者见仁,智者见智,无论怎么看,都不可能否认进程的内存划分本质。
回到线程。
本文一开始就提到,一台计算机的处理器资源是不确定的。这种不确定有两个层次上的不确定,一是相对于即将被安装来使用这台计算机的OS,它并不可能提前知道这台机器的处理器资源。甚至在安装了以后仍然不可能知道;另外一层意思则是指,系统所探测到的处理器资源本身就是不确定的。因为一切都是数据,系统所能得到的也只是数据。数据有时候并不只有真不真的问题,数据本身就是模糊的。
处理器资源的这种不确定,逼使一种中间结构的出现:线程。当然,进程也可以用来表达这个意思而且历史也的确是这么表达的。有人可能会说,探测到的处理器数量可以直接报给系统并公布或提供给上层的应用,所以所谓线程只是一种处理资源复用机制而如最初的进程理论所言。没错,在计算机的世界里复用无处不在。比如线程本身也可以被复用。但这并不能否认资源数量的不确定性与线程结构之间的因果关系:如果不封装的话,OS要如何提前(在“见”到真正的处理器)表达这些处理器或者说处理器资源呢?
所以说,这里必须要有一个概念(这是人类思维的缺陷。但是,整个计算机世界又何尝不是为了弥补人类的这个缺陷而制造出来的东西呢?否则,我们为什么到现在也不能认识人脑的真正结构呢?因为这个结构,正是我们一切思维的因。认识这个结构则意味着用果去认识因,怎么会不难呢?-----!,!,!)的存在。并且因为计算机本身的形式化(人脑以外的一切事物都是形式化的。或者说,人脑中的一切概念就是对外界的形式化)本质,它必须有一个以计算机世界的语言存在的形式化。
它必须被形式化。
现在我们可以再次回到主题。
弄清了线程的本质,也就是说,它就是一个处理器资源的“Stub”。We want things work, we then have to make it work! 线程就是这个Way to make it work.
所以说,线程是一个向下的概念。而Android的哲学是向上的。很多人说Android是一个操作系统。其实从最传统的意义上说,它并不是一个真正“纯正”的操作系统。因为最传统意义上的操作系统是向下的。大家还记得最初的个人操作系统名字叫做什么?
DOS!Disk Operation System.
Disk显然是一个向下的概念。至少站在操作系统的角度上说来是这样。而Android是第一个向上的系统。
这么多年来,微软一直在做的事情,虽然也有部分是“向上”的。但即使是这样,这些“向上”的工作大部分也是以补丁的形式而提供出来的。
很多人一直在争论苹果与微软的区别。其实苹果跟微软根本就没有可比性。苹果是向上的,而微软是向下的。今天刚看过一个新闻说比尔盖茨与乔布斯两个人上了同一档谈话节目。席间的对话看起来很融洽,但其实我一直DOUBT这两个人拥 有任何共同语言。当然这么说并不是说苹果是个优秀的系统。但是苹果领导了这个革命。苹果不优秀,但是它很伟大。乔布斯很伟大。比尔不伟大。比尔只不过把OS从大机器搬到了小机器上(原来叫微机,现在估计不会这么叫了。现在。。。呵呵,恐怕连手机都不能算“微”机了吧)。
伟大的人。我们向你致敬!
但是从纯萃的操作系统的角度,苹果与ANDROID还是没得比的。前面有文章提过,乔布斯根本不能算是一个合格的计算机或软件工程师。他所做出的一切成就都只不过基于他的天生的艺术直觉。这一点是他领导了革命的基本,但却也是使得他最终只能成为孙中山一样的人物而不是蒋介石一样的人物的根本原因。孙中山的问题是虽然革命成功了但还是不懂政治,而乔布斯的问题是相似的:他虽然革命也成功了,但他还是不懂软件。以致于给ANDROID的开发者留下一个这么大的机会。
ANDROID里面的四大组件,概念上全部都是向上的:Activity, Service, BroadcastReceiver, ContentProvider。这里面哪一个离开了用户都不可能具有任何意义。都是用户Oriented。
离开了用户,甚至连讨论它们都成为不可能。
这就是ANDROID之所以优秀的地方!
微软再做一百年,还是一个Disk Operating System。而ANDROID从一开始就摆脱了DISK。苹果则充其量在OS革命上扮演了一个历史性的角色而已。真正的未来,不只是属于ANDROID的,它还属于ANDROID的继往开来者。它属于The communist。它属于为民造福的,真真正正为人民服务的人。
而将这些组件与系统连起来,正是ANDROID FRAMEWORK所做的事情。认识到这一点是至关重要的,因为这是整个ANDROID系统的设计哲学。所有的东西如Activity, Task ,Service等等,一切概念都是向上的。而它们的落地,则都是通过ANDROID FRAMEWORK实现的。ANDROID FRAMEWORK就是干这个的。这一点很重要,因为只有认识到了这一点,你才不会把所有那些上层概念硬扯着跟系统底层或者说资源级的概念混淆起来,比如说线程,进程,应用程序(写到这里,又要提醒一下:应用程序其实不算是一个系统运行时的概念。运行时概念指那些仅涉及运行时,机器认识层次的概念。这些概念,是机器能掌握的概念。而应用程序不是这样的概念。机器没有或者说并没有被设计成要求去理解或表现得好像理解了这样的概念。应用程序这个概念主要是针对人的一个概念,机器拥 有的对应概念是,比如,象Executable,Runnable, 这样的东西)。
事实上,ANDROID本身的文档也说得很清楚那就是Service与Activity或其它Android中的组件概念一样,它们都RUN在其HOST进程的主线程中。其实我很估计Service就是被设计用来填充大多数UI线程在大多数时候的空闲时间的。否则,如果系统根本没有闲余的资源去完成SERVICE的工作的话,设计一个这样的东西显然会成为系统的累赘。也就是说,如果你不为SERVICE或CONTENT PROVIDER设计专用的线程,那么它们很可能阻塞住你的ACTIVITY的工作(Which is mainly some UI update work)。系统具体对四大组件的调用机制或者说优先级不知道到底是什么样子,但是不管是怎样的,工作始终都要被完成,最终都将存在冲突。唯一解决这种冲突的办法便是减少各自的工作。工作越少便越难冲突。所以说,你写程序的主要任务便是,让系统尽量少地工作而不是尽量多地工作或者说尽量提高程序运行的效率。这个效率包括代码级的效率,算法上的效率,整体合作上的效率。最终的效率肯定是一个非常难以衡量的东西,特别是在一些比较复杂或运算性比较强的应用中,但你必须最终COME OUT出一个方案。
我们平常写程序很少会涉及到这方面的东西。真正涉及到这些东西的时候,衡量你是否一个好的程序员的标准会让你吓一大跳:比如首先,要求你是一个完美的数学家。甚至要求你在某个方面去创新;另外,你光懂这些还不够,可能还要懂一点经济上的理论,信息学上的理论,系统控制上的理论......Wait a minute, What are you talking about on earth? What kind of people you think I am? But anyway, 作为一个程序员,你应该最少了解程序相关的东西并且在有相关专家参与的时候,能提供尽量全面的专业合作与知识支持以达到尽快完成工作的目的。Isn't it? Am I right?