1. 程式人生 > >oc基礎總結二 執行緒和程序

oc基礎總結二 執行緒和程序

前言         幾乎所有的作業系統都支援同時執行多個任務,一個任務通常就是一個程式,每個執行中的程式就是一個程序,也就是說,所有執行中的任務通常對應一個程序。         當一個程式執行時,內部可能包含多個順序執行流,每個順序執行流就是一個執行緒。

一、程序:

1、簡介 (1)程序是指在系統中正在執行的一個應用程式。 (2)每個程序之間是獨立的,每個程序均執行在其專用且受保護的內容空間內。 (3)通過“活動監視器”可以檢視mac系統中所開啟的程序。
2、程序通訊 單機系統中程序通訊有四種形式:主從式、會話式、訊息或郵箱機制、共享儲存區方式。 主從式例子:終端控制程序和終端程序。 會話式例子:使用者程序與磁碟管理程序之間的通訊。

二、執行緒

1、執行緒簡介: 1》執行緒(Thread),也稱作輕量級程序,執行緒是程序的組成部分,一個程序可以擁有多個執行緒。 2》執行緒在程式中是獨立的、併發的執行流,當程序被初始化後,主執行緒就被建立了。 3》可以在程序內建立多條順序執行流,這些順序執行流就是執行緒,每條執行緒是相互獨立的。 4》執行緒是獨立執行的,單個執行緒他是不知道程序中是否存在其他的執行緒,執行緒的執行是搶佔式的。(當前執行的執行緒在任何時候都可能被掛起,以便另外一個執行緒可以執行)。 2、注意點: (1)一個程序要想執行任務,必須得有執行緒(每一個程序至少要有一條執行緒,可以有多個執行緒)。 (2)執行緒是程序的基本執行的單元,一個程序(程式)的所有的任務都線上程中執行。
(3)一個執行緒中的任務的執行是序列的。(如果要在一個執行緒中執行多個任務,那麼只能一個一個地按照順序執行這些任務)。 (4)在同一時間內,一個執行緒只能執行一個任務。 3、執行緒總結: (1)作業系統可以同時執行多個任務,每個任務就是程序,程序可以同時執行多個任務,每個任務就是執行緒。 (2)一個程式執行後至少有一個程序,一個程序例可以包含多個執行緒,但至少有一個主執行緒。 4、執行緒執行特性: (1)執行緒只有3個基本狀態:就緒,執行,阻塞。 (2)執行緒存在5種基本操作來切換執行緒的狀態:派生、阻塞、啟用、排程、結束。

三、多執行緒

1、 (1)一個程序中可以開啟多條執行緒,每條執行緒可以並行(同時)執行不同的任務。
(2)多執行緒技術可以提高程式的執行效率。 2、多執行緒的原理: (1)同一時間,CPU只能處理一條執行緒,只有一條執行緒在工作(執行)。 (2)多執行緒併發(同時)執行,其實是CPU快速地在多條執行緒之間排程(切換)。 (3)如果CPU排程執行緒的時間足夠快,就會造成了多個執行緒併發執行的假象。 (4)如果執行緒非常多,CPU會在N多執行緒之間排程,CPU會累死,消耗大量的CPU資源,每條執行緒被呼叫執行的頻次會降低(執行緒的執行效率降低)。 3、 多執行緒的優點: (1)能夠適當提高程式的執行效率。 (2)那那個適當地提高資源利用率(CPU、記憶體利用率)。 4、多執行緒的優勢: (1)對於單執行緒的應用而言,整個應用只有一個順序執行流,當執行流在某個耗時操作或不能立即完成的任務時(如網路請求、複雜的操作和執行過程、某些必須消耗一定時間後才能完成的操作),該執行流就會被阻塞,整個應用就會被卡在那裡無法繼續執行,因此單執行緒的程式往往功能非常有限。 (2)在實際應用中多執行緒是非常有用的,例如:使用者操作介面上的某個按鈕時,該按鈕需要執行的任務需要幾秒甚至十幾秒,如果直接在UI執行緒(主執行緒)中完成這個任務,在該任務執行完成、返回之間,UI執行緒被該任務阻塞,無法響應使用者的其他操作(這段時間內,使用者對iOS系統的操作將不會有任何反應,除非使用者單機Home鍵返回,但這並不是使用者希望的結果)。 5、多執行緒的缺點 (1)開啟執行緒需要佔用一定的記憶體空間(預設情況下,主執行緒佔用1M,子執行緒佔用512KB),如果開啟大量的執行緒,會佔用大量的記憶體空間,降低程式的效能。 (2)執行緒越多,CPU在排程執行緒上的開銷就越大。 (3)程式設計更加複雜:如執行緒之間的通訊,多執行緒的資料共享。 6、多執行緒在iOS開發中的應用 (1)主執行緒:一個iOS程式執行後,預設會開啟1條執行緒,稱為主執行緒(UI執行緒)。 (2)主執行緒的主要作用: 1、顯示、重新整理UI介面 2、處理UI事件(點選事件、滾動事件、拖曳事件等)。 (3)主執行緒:注:比較耗時的操作不要放在主執行緒中。耗時操作會卡住主執行緒,嚴重影響UI的流暢度,給使用者一種卡的壞的體驗。 7、建立執行緒 (1)一個NSThread物件就代表一條執行緒 (2)建立、啟動執行緒 1>方式一: -(id)initWithTarget:(id)target selector:(SEL)selector object:(id)arg;建立一個新的執行緒物件。 示例:  NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil]; 執行緒一啟動,就會線上程thread中執行self的run方法。 注:target:物件self的selector方法體代表了執行緒需要完成的任務,因此相當於把target物件的selector方法轉換為執行緒執行體。 2>方式二:建立執行緒後自動啟動執行緒 +(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)arg; 示例: [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 優點:簡單快捷 缺點:無法對執行緒進行更詳細的設定 方式一、二的區別:這兩種建立執行緒的方式並沒有明顯區別,只是第一種方式是一個例項方法,該方法返回一個NSThread物件,必須呼叫start方法啟動執行緒;而第二種方法不會返回NSThread物件,因此這種方式會直接建立並啟動執行緒。 3>方式三:隱式建立並啟動執行緒 [self performSelectorInBackground:@selector(run) whithObject:nil]; 優點:簡單快捷 缺點:無法對執行緒進行更詳細的設定 (3)主執行緒的相關用法: +(NSThred *)mainThread;//獲得主執行緒 - (BOOL)isMainThread;//是否為主執行緒 +(BOOL)isMainThread;//是否為主執行緒 (4)獲得當前執行緒 NSThread *current = [NSThread currentThread]; (5)執行緒的排程優先順序:排程優先順序的取值範圍是0.0~1.0,預設0.5,值越大,優先順序越高。 +(double)threadPriority; +(BOOl)setThreadPriority:(double)p; (6)設定執行緒的名字 -(void)setName:(NSString *)n; -(NSString *)name; 8、iOS中的多執行緒程式設計技術 (1)使用NSThread實現多執行緒 (2)使用NSOperation與NSOperationQueue實現多執行緒 (3)使用GCD(Grand Central Dispatch)實現多執行緒 注:這三種方式,從上到下抽象程度從低到高的,抽象程度越高的用法月簡單。 程式碼:

四、多執行緒的安全隱患

1、資源共享 一塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源。當多個執行緒訪問同一資源時,很容易引發資料散亂和資料安全問題。(如多個執行緒訪問同一個物件、同一個變數、同一個檔案)。 2、解決方法:使用互斥鎖 使用的格式:@synchronized(鎖物件){//需要鎖定的程式碼} 注:鎖定一份程式碼只用一把鎖,用多吧鎖是無效的。 3、互斥鎖的優點:能有效防止因多執行緒搶奪資源造成的資料安全問題 4、互斥鎖的缺點:需要消耗大量的CPU資源。 5、互斥鎖的使用前提:多條執行緒搶奪同一塊資源。 相關專業術語:執行緒同步,多條執行緒按順序地執行任務。(互斥鎖就是使用了執行緒同步技術)。 6、示例:在建立單例模式時,最好使用互斥鎖。此處示例是建立UserInfo類的單例物件。 程式碼部分:

static UserInfo *singletonUserInfo = nil;

+(UserInfo *)shareUserInfo{

@synchronized(self){

//建立一個執行緒鎖,防止多執行緒中多次建立

        if (singletonUserInfo == nil) {

singletonUserInfo = [[UserInfoalloc]init];

            NSLog(@"初始化");

        }

    }

returnsingletonUserInfo;

}


五、原子性、非原子性 atomic:原子性,為setter方法加鎖(預設就是atomic),執行緒安全,需要消耗大量的資源 nonatomic:非原子性,不會為setter方法加鎖,非執行緒安全,適合記憶體小的移動裝置 iOS開發:最好所有屬性都宣告為nonatomic,儘量避免多執行緒搶奪同一塊資源,儘量將加鎖、資源搶奪的業務邏輯交給伺服器端處理,減小移動客戶端的壓力。