進程:在系統中可以獨立運行並做爲資源分配的基本單位,由一組指令、數據和堆棧等組成,是一個可以獨立運行的活動實體。多線程
線程:每一個進程中至少有一個線程(結合iOS開發來講,每一個進程都至少有一個主線程,又或者說叫UI線程);併發
串行:單個任務執行,一個任務執行完畢後在執行下一個任務;框架
併發:多個任務同時執行(一般爲多線程);異步
兩者區別:任務的執行方式。async
同步:只能在當前線程執行,不具有開啓線程的能力;函數
異步:具有開啓新線程的能力;多個線程獨立執行;無前後順序的影響;spa
兩者區別:是否可以開啓新線程。線程
在iOS開發的過程當中通常有四種多線程的方法:code
1-pThread (C語言實現 支持多平臺 複雜難理解 幾乎不用)orm
2-NSThread (OC語言 簡單 偶爾使用)
3-GCD (C語言實現 常常使用 掌握)
4-NSOperation (對GCD的封裝 常常使用 掌握)
NSThread 我的接觸到的有3種開啓線程的方法:
a, 實例化NSThread類對象,而後調用對象的start方法,手動開啓子線程;注:程序猿無需關閉線程,在線程的任務執行完畢後,系統會自動關閉線程。
b,使用類方法 「detach...」來開啓子線程,不用手動開啓,線程自動啓動;
c,隱式開啓「perform...」,一樣不須要手動開啓,線程自動啓動;
GCD
在瞭解GCD以前,咱們須要先了解「隊列」和「任務」這連個概念;
GCD有一個機制叫:「隊列分發機制」;遵循「FIFO--先進先出,後進後出」;
GCD的框架:lib_dispatch庫;
使用步驟:建立隊列,而後將任務添加到隊列中(上代碼:):
//「異步函數 + 併發隊列」 //1,建立隊列(DISPATCH_QUEUE_SERIAL--串行隊列、DISPATCH_QUEUE_CONCURRENT--併發隊列) dispatch_queue_t queue = dispatch_queue_create("queue_1", DISPATCH_QUEUE_CONCURRENT); //2,將任務添加到隊列(同步函數dispatch_sync:,異步函數:dispatch_async) dispatch_async(queue, ^{ NSLog(@"-------------%@",[NSThread currentThread]);//任務 }); //「同步函數+併發隊列」 dispatch_queue_t queue_2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_sync(queue_2, ^{ NSLog(@"-------------%@",[NSThread currentThread]);//任務 }); //異步函數+串行隊列 dispatch_queue_t queue_3 = dispatch_queue_create("queue_3", DISPATCH_QUEUE_SERIAL); dispatch_async(queue_3, ^{ for (int i = 0; i<10000; i++) { NSLog(@"=====%d",i); } NSLog(@"1-------------%@",[NSThread currentThread]); }); dispatch_async(queue_3, ^{ NSLog(@"2-------------%@",[NSThread currentThread]); }); dispatch_async(queue_3, ^{ NSLog(@"3-------------%@",[NSThread currentThread]); });
建立隊列的幾個函數:
dispatch_queue_create(能夠建立併發隊列、也能夠建立串行隊列);
全局隊列--dispatch_get_global_queue( "隊列優先級" , 0 );(默認爲併發隊列,當有多個隊列時候,隊列的優先級纔會體現出來)。
主隊列--dispatch_get_main_queue,特殊的串行隊列,主隊列中的任務都會在主線程中執行;
線程阻塞問題!!!--使用sync函數往當前的串行隊列添加任務,會卡住當前的串行隊列。
//線程卡住,nslog函數不會執行 dispatch_queue_t queue_4 = dispatch_get_main_queue(); dispatch_sync(queue_4, ^{ NSLog(@"2-------------%@",[NSThread currentThread]); });
以上僅爲我的理解,如有不對的地方,望你們指出,謝謝。