① 在IOS中為什麼使用多線程及多線程實現的三種方法
多線程是一個比較輕量級的方法來實現單個應用程序內多個代碼執行路徑。
在系統級別內,程序並排執行,程序分配到每個程序的執行時間是基於該程序的所需時間和其他程序的所需時間來決定的。
然而,在每個程序內部,存在一個或者多個執行線程,它同時或在一個幾乎同時發生的方式里執行不同的任務。
概要提示:
iPhone中的線程應用並不是無節制的,官方給出的資料顯示,iPhone OS下的主線程的堆棧大小是1M,第二個線程開始就是512KB,並且該值不能通過編譯器開關或線程API函數來更改,只有主線程有直接修改UI的能力
一、線程概述
有些程序是一條直線,起點到終點——如簡單的hello world,運行列印完,它的生命周期便結束了,像是曇花一現。
有些程序是一個圓,不斷循環直到將它切斷——如操作系統,一直運行直到你關機。
一個運行著的程序就是一個進程或者叫做一個任務,一個進程至少包含一個線程,線程就是程序的執行流。
Mac和IOS中的程序啟動,創建好一個進程的同時,一個線程便開始運作,這個線程叫做主線程。主線成在程序中的位置和其他線程不同,它是其他線程最終的父線程,且所有的界面的顯示操作即AppKit或UIKit的操作必須在主線程進行。
系統中每一個進程都有自己獨立的虛擬內存空間,而同一個進程中的多個線程則公用進程的內存空間。
每創建一個新的進成,都需要一些內存(如每個線程有自己的stack空間)和消耗一定的CPU時間。
當多個進成對同一個資源出現爭奪的時候需要注意線程安全問題
創建線程
創建一個新的線程就是給進程增加一個執行流,所以新建一個線程需要提供一個函數或者方法作為線程的進口。
1.使用NSThread
NSThread提供了創建線程的路徑,還可以提供了監測當前線程是否是主線程的方法使用NSThread創建一個新的線程有兩種方式:
1.創建一個NSThread的對象,調用Start方法——使用一個目標對象的方法初始化一個NSThread對象,或者創建一個繼承自NSThread的子類,實現起main方法?,然後在直接創建這個子類的對象。
2.使用detachNewThreadSelector:toTarget:withObject:這個類方法創建一個子線程,這個比較直接,直接使用目標對象的方法作為線程啟動入口
2.使用NSObject
使用NSObject直接就加入了對多線程的支持,允許對象的某個方法在後台運行。
[my0bj performSelectorInBackground:@selector(doSomething) withObject:nil];
3.POSIX Thread
由於Mac和IOS都是基於Darwin系統,Darwin系統的UNX內核,是基於mach和BSD的,繼承了BSD的POSIX介面,所以可以直接使用POSIX線程的相關介面開實現線程
創建線程的介面為 pthread_create, 當然在創建線程之前可以創建好相關線程的屬性