多線程,一直是解決內存暴增方法的重點,圖片、視頻、大量數據的的下載現在總結一下
基本概念
進程:應用程序的執行實例,簡單來說就是在操作系統中運行的程序
線程:進程中負責程序執行的執行單元。一個進程中至少有一個線程。
多線程:解決多任務同時執行的需求,合理使用CPU資源。多線程的運行是根據CPU切換完成,如何切換由CPU決定,因此多線程運行具有不確定性。
線程池:基本思想還是一種對象池的思想,開辟一塊內存空間,里面存放了眾多(未死亡)的線程,池中線程執行調度由池管理器來處理。當有線程任務時,從池中取一個,執行完成后線程對象歸池,這樣可以避免反復創建線程對象所帶來的性能開銷,節省了系統的資源。
一、進程
1、進程是應用程序的執行實例,簡單來說就是在操作系統中運行的程序。例如我在手機上只打開QQ和微信這兩個軟件,系統中就會有兩個進程存在。它們互相是獨立的。
2、進程不能執行任務。
3、進程在運行時創建的資源隨著進程的終止而死亡。
二、線程池
線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,并處于多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。----百度百科
對于iOS來說,建議在盡可能的情況下避免直接操作線程,使用比如NSOperationQueue這樣的機制。
可以把NSOperationQueue看作一個線程池,可往線程池中添加操作(NSOperation)到隊列中。線程池中的線程可看作消費者,從隊列中取走操作,并執行它。
三、線程
1、進程本身是不能執行任務的,進程想要執行任務必須的有線程,線程是進程內部的一個獨立的執行單元,同時只能執行一個任務,相當于一個子程序。線程被分為兩種,主線程(用戶界面線程)和子線程(工作線程或稱為后臺線程)。
2、線程執行完畢就會被銷毀。
3、主線程(也稱父線程)當應用程序啟動時自動創建和啟動,通常用來處理用戶的輸入并響應各種事件和消息。主線程的終止也意味著該程序的結束。
4、子線程:由主線程來創建,用來幫助主線程執行程序的后臺處理任務。如果子線程A中又創建一個子線程B,在創建之后,這兩者就是相互獨立的,多個子線程之間效果上可以同時執行。
5、一個進程中可以有多個線程,并且所有線程都在該進程的虛擬地址空間中,可以使用進程的全局變量和系統資源。
6、線程的五種狀態:
6.1 新建狀態:線程對象已經創建,還沒有在其上調用start()方法。
self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil];
6.2就緒狀態:當線程有資格運行,但調度程序還沒有把它選定為運行線程時線程所處的狀態。當start()方法調用時,線程首先進入可運行狀態。在線程運行之后或者從阻塞、等待或睡眠狀態回來后,也返回到可運行狀態。
[self.thread start];
6.3 運行狀態:線程調度程序從可運行池中選擇一個線程作為當前線程時線程所處的狀態。這也是線程進入運行狀態的唯一一種方式。
6.4 阻塞狀態:這是線程有資格運行時它所處的狀態。實際上這個三狀態組合為一種,其共同點是:線程仍舊是活的,但是當前沒有條件運行。換句話說,它是可運行的,但是如果某件事件出現,有可能返回到可運行狀態。 (所謂阻塞狀態是正在運行的線程沒有運行結束,暫時讓出CPU,這時其他處于就緒狀態的線程就可以獲得CPU時間,進入運行狀態。)
(1)設置線程阻塞1,阻塞2秒
[NSThread sleepForTimeInterval:2.0];
(2)第二種設置線程阻塞2,以當前時間為基準阻塞4秒
NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0];
[NSThread sleepUntilDate:date];
6.5 死亡狀態:當線程的任務結束,發生異常,或者是強制退出這三種情況會導致線程的死亡。線程一旦死亡,就不能復生。線程死亡后,線程對象從內存中移除。
7、線程的串行
1個線程中任務的執行是串行的
如果要在1個線程中執行多個任務,那么只能一個一個地按順序執行這些任務
也就是說,在同一時間內,1個線程只能執行1個任務
比如在1個線程中下載3個文件(分別是文件A、文件B、文件C)
四、多線程
1、多線程:1個進程中可以開啟多條線程,每條線程可以并行(同時)執行不同的任務
2、多線程原理:
同一時間,CPU只能處理1條線程,只有1條線程在工作(執行)
多線程并發(同時)執行,其實是CPU快速地在多條線程之間調度(切換)
如果CPU調度線程的時間足夠快,就造成了多線程并發執行的假象。
思考:如果線程非常非常多,會發生什么情況?
CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源
每條線程被調度執行的頻次會降低(線程的執行效率降低)——所以一般我們會控制線程的數量。
3、多線程的優缺點
多線程的優點
能適當提高程序的執行效率
能適當提高資源利用率(CPU、內存利用率)
多線程的缺點
開啟線程需要占用一定的內存空間(默認情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會占用大量的內存空間,降低程序的性能
線程越多,CPU在調度線程上的開銷就越大
程序設計更加復雜:比如線程之間的通信、多線程的數據共享
4、多線程在iOS開發中的應用
主線程:一個iOS程序運行后,默認會開啟1條線程,稱為“主線程”或“UI線程”
主線程的主要作用:
顯示\刷新UI界面
處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
** 附注:主線程的使用注意:別將比較耗時的操作放到主線程中。耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗**
五、iOS中的多線程方案
分為4種,從最早的pthread到基于GCD的NSOperation.
1、pthread:(C語言,非常古老的一種多線程方法)開發中用的比較少
2、NSThread (OC語言,開發中用的也比較少,主要用于調試程序)
3、GCD (C語言,蘋果進行了封裝,開發中用的比較多)
4、NSOperation (基于GCD,開發中用的非常多)
其中3和4系統會自動進行內存管理。當然,用的最多的也是GCD和NSOperation
線程理解,可參照:http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=403498894&idx=2&sn=219c1a6001b5bb7e6bdc7963b1af8450&scene=2&srcid=0330UDNmQ2GlTOLo1CY8IZfH&from=timeline&isappinstalled=0#wechat_redirect
參考來源:
http://blog.csdn.net/peter_teng/article/details/10197785
http://www.cnblogs.com/wendingding/p/3807184.html
http://www.cnblogs.com/wendingding/p/3805088.html