近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程式運算時間的方法,大大的提高了程式的運算效率,那麼首先我們來說一下進程和線程概念: 一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進
近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程式運算時間的方法,大大的提高了程式的運算效率,那麼首先我們來說一下進程和線程概念:
一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進程中的所有線程都共用該記憶體空間。
進程:是一個具有一定獨立功能的程式關於某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的資源分配單元,也是基本的執行單元。獨立的地址空間使得不同的進程共用狀態信息變得非常困難,為了共用信息,它們必須顯式的使用(進程通信機制),進程之間通信比較慢,因為進程式控制制和進程式通信機制開銷很大。
線程:進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程式間併發執行的程度。一個線程就是運行在進程上下文的一個邏輯流。現代操作系統允許我們編寫一個進程里同時運行多個線程的程式。線程由內核調度。每個進程開始生命周期時都是單一線程,這個線程稱為主線程,在某一時刻,主線程創建一個對等線程。從這個時間點開始,兩個線程就併發運行。最後,因為主線程執行一個慢速系統調用,如read或者sleep,控制就會通過上下文切換傳遞到對等線程。在控制傳遞迴主線程前,對等線程會執行一段時間。
(一) 傳統的程式執行方式是一種順序執行方式,即本句執行完成之後,才會執行下一句。
在調用一個函數或者執行一個數位塊時,執行該程式占用系統主程式的執行時間,也就是說,這個函數或代碼塊不執行完系統是不會執行下一條指令的:
例如: 我們在主函數里調用 [self doOneThing];[self doTheSecondThing]; 只有第一個正確執行後才會執行下一個函數。
(二) 多線程下程式塊可以併發執行,大大地節省了程式的執行時間,下麵列出創建多線程的幾種方式:
(1)使用performSelectorInBackground創建一個線程:也就是說在程式執行doThing與執行下一段程式是同步執行的
[self performSelectorInBackground:@selector(doThing) withObject:nil];
(2)直接創建一個線程,selector選擇器則指明將要進行的操作,用這種方法時線程直接啟動:
[NSThread detachNewThreadSelector:@selector(doThing) toTarget:self withObject:nil];
(3)創建一個線程並設置啟動方式
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doThing) object:nil];
thread.name = @"QingYun";
[thread start];
(4)創建一個多線程的隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
創建一個操作對象,這個操作對象定義了多線程需要執行作務
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doThing) object:nil];
[queue addOperation:operation]; // 將操作對象放到這個隊列里,這樣線程就可以直接啟動
(5)使用Block塊操作對象的方式創建線程,添加到隊列中並啟動線程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"do thing....");
[NSThread sleepForTimeInterval:10];}
[queue addOperation:operation];
(6)使用隊列分發模式創建線程:下麵以非同步分發創建線程為例說明其工作原理,在非同步線程中,在分發時系統對線程按順序分發下去,但在執行的過程中,則線程之間又存在相互競爭的關係。
dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async (queque,^{ [NSThreadsleepForTimeInterval:5];};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{[NSThreadsleepForTimeInterval:5];};