近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程序運算時間的方法,大大的提高了程序的運算效率,那么首先我們來說一下進程和線程概念:
一個程序包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的內存空間,相應的一個進程中的所有線程都共享該內存空間。
進程:是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的資源分配單元,也是基本的執行單元。獨立的地址空間使得不同的進程共享狀態信息變得非常困難,為了共享信息,它們必須顯式的使用(進程通信機制),進程之間通信比較慢,因為進程控制和進程序通信機制開銷很大。
線程:進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由于線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間并發執行的程度。一個線程就是運行在進程上下文的一個邏輯流。現代操作系統允許我們編寫一個進程里同時運行多個線程的程序。線程由內核調度。每個進程開始生命周期時都是單一線程,這個線程稱為主線程,在某一時刻,主線程創建一個對等線程。從這個時間點開始,兩個線程就并發運行。最后,因為主線程執行一個慢速系統調用,如read或者sleep,控制就會通過上下文切換傳遞到對等線程。在控制傳遞回主線程前,對等線程會執行一段時間。
?。ㄒ唬?傳統的程序執行方式是一種順序執行方式,即本句執行完成之后,才會執行下一句。
在調用一個函數或者執行一個數碼塊時,執行該程序占用系統主程序的執行時間,也就是說,這個函數或代碼塊不執行完系統是不會執行下一條指令的:
例如: 我們在主函數里調用 [self doOneThing];[self doTheSecondThing]; 只有第一個正確執行后才會執行下一個函數。
?。ǘ?多線程下程序塊可以并發執行,大大地節省了程序的執行時間,下面列出創建多線程的幾種方式:
?。?)使用performSelectorInBackground創建一個線程:也就是說在程序執行doThing與執行下一段程序是同步執行的
[self performSelectorInBackground:@selector(doThing) withObject:nil];
?。?)直接創建一個線程,selector選擇器則指明將要進行的操作,用這種方法時線程直接啟動:
[NSThread detachNewThreadSelector:@selector(doThing) toTarget:self withObject:nil];
?。?)創建一個線程并設置啟動方式
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doThing) object:nil];
thread.name = @"QingYun";
[thread start];
?。?)創建一個多線程的隊列
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];
?。?)使用隊列分發模式創建線程:下面以異步分發創建線程為例說明其工作原理,在異步線程中,在分發時系統對線程按順序分發下去,但在執行的過程中,則線程之間又存在相互競爭的關系。
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];};
新聞熱點
疑難解答