jQuery AJAX —开篇 $.load()

线程按照结束方式来说,分为前台线程和后台线程

一个应用程序运行,会启动一个进程,这个进程拥有多个线程,其中可能有前台线程,也有后台线程。只有所有的前台线程都结束了,系统才会卸载应用程序域,也就是说,停止该进程,回收该进程占用的内存等资源。后台线程必须依附于某个前台线程,不能单独存在。当所有的前台线程都退出后,系统会强制结束所有的后台线程,并卸载应用程序域。举个例子来说,有一个WinForm程序,第一种情况,A为UI线程,是前台线程,B也为前台线程,向某一个文本写入信息。注意,B线程是不像UI线程那样能够直观的让人看见,有点类似于QQ等后台运行的意思,但是这依然是一个前台线程。这是由线程的IsBackgournd属性决定的。B线程自打开始运行后,就不会再受到父线程的任何影响,两者是一个完全平行的关系。当我们关闭UI后,前台线程结束了,虽然现在看不到任何界面,但是子线程B线程依然在运行。所以,系统也就没有结束这些线程所在的进程。第二种情况,A为UI线程,是前台线程,B为向文本写入内容的线程,但这次设置为了后台线程。当我们把UI线程关闭后,所有的前台线程都消失了,此时,B线程的父线程结束了,B线程也会被系统强制结束。我们发现,向文本写入内容的后台线程已经自动被强制结束了。


主线程与子线程,是线程出现方式上的概念

一个线程产生了另一个线程,前者就是主线程,后者就是子线程。线程一旦产生,那么就与主线程是平等的地位,没有主次的关系。在WinForm程序中,第一个线程是UI线程,其他线程都是由这个线程产生的,所以UI线程是主线程。但是从这个线程衍生出来的任何线程,无论是前台线程,还是后台线程,相互之间,以及与UI线程,都是地位平等的关系。如果产生的子线程是前台线程,那么主线程与子线程就是在生命周期方面是平行的关系,相互之间是平等的。如果产生的子线程是后台线程,那么,这个线程与前台线程唯一的区别就是,不会阻止进程的结束,当所有前台线程结束后,这个线程会被强制结束

这样设计的原因:因为后台线程一般做的都是需要花费大量时间的工作,如果不这样设计,主线程已经结束,而后台工作线程还在继续,后台线程即时执行完成也已经没有什么实际的意义。比如说,有一个WinForm程序,UI用来显示计算结果,子线程B用来进行大量的十分耗时耗资源的计算。当用户打开程序后,由于某种原因,UI线程死掉并且退出了,如果此时子线程不是后台线程被强制结束的话,剩下的耗时耗资源的运算是没有意义的,因为即使有了结果,也无法再UI上来显示,因为UI已经退出了。另外的例子,Word的UI线程为前台线程,拼写检查为后台线程。如果关闭Word应用程序,拼写检查器继续运行器进程就没有意义了。在应用程序结束时,拼写检查器就可以关闭了。


主线程与子线程,前台线程与后台线程,是从线程的生成顺序和线程是否阻止进程退出这两个不同的方面进行区分的,是不同方面的概念。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。