多線程開發之GCD
簡介
GCD本身是蘋果公司為多核的並行運算提出的解決方案。GCD在工作時會自動利用更多的處理器核心,以充分利用更強大的機器。GCD是Grand Central Dispatch的簡稱,它是基於C語言的。如果使用GCD,完全由系統管理線程,我們不需要編寫線程代碼。只需定義想要執行的任務,然後添加到適當的調度隊列(dispatch queue)。GCD會負責創建線程和調度你的任務,系統直接提供線程管理
GCD優勢
GCD可用於多核的並行運算
GCD會自動利用更多的CPU內核(比如雙核、四核)
GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程)
程序員只需要告訴GCD想要執行什麽任務,不需要編寫任何線程管理代碼
任務和隊列
GCD中的兩個核心概念
任務:執行什麽操作,在GCD就是一個Block,任務執行的兩種方式:同步執行和異步執行。主要區別在於是否具備開啟新線程的能力
同步執行(sync):只能在當前線程中執行任務,不具備開啟新線程的能力
異步執行(async):可以在新的線程中執行任務,具備開啟新線程的能力
隊列:存放任務,隊列是一種特殊的線性表,采用FIFO(先進先出)的原則,即新任務總是被插入到隊列的末尾,而讀取任務的時候總是從隊列的頭部開始讀取。每讀取一個任務,則從隊列中釋放一個任務。在GCD中有兩種隊列:串行隊列和並行隊列。
註意:
放到並行隊列的任務,GCD 也會FIFO
的取出來,但不同的是,它取出來一個就會放到別的線程,然後再取出來一個又放到另一個的線程。這樣由於取的動作很快,忽略不計,看起來,所有的任務都是一起執行的。不過需要註意,GCD 會根據系統資源控制並行的數量,所以如果任務很多,它並不會讓所有任務同時執行。
並行隊列(Concurrent Dispatch Queue):可以讓多個任務並行(同時)執行(自動開啟多個線程同時執行任務)
並行功能只有在異步(dispatch_async)函數下才有效
串行隊列(Serial Dispatch Queue):讓任務一個接著一個地執行(一個任務執行完畢後,再執行下一個任務)
GCD的使用步驟
1、創建一個隊列(串行隊列或並行隊列)
2、將任務添加到隊列中,然後系統就會根據任務類型執行任務(同步執行或異步執行)
1. 隊列的創建方法
可以使用dispatch_queue_create
來創建對象,需要傳入兩個參數,第一個參數表示隊列的唯一標識符,用於DEBUG,可為空;第二個參數用來識別是串行隊列還是並行隊列。DISPATCH_QUEUE_SERIAL
表示串行隊列,DISPATCH_QUEUE_CONCURRENT
// 串行隊列的創建方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
// 並行隊列的創建方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
對於並行隊列,還可以使用dispatch_get_global_queue
來創建全局並行隊列。GCD默認提供了全局的並行隊列,需要傳入兩個參數。第一個參數表示隊列優先級,一般用DISPATCH_QUEUE_PRIORITY_DEFAULT
。第二個參數暫時沒用,用0
即可。
2. 任務的創建方法
// 同步執行任務創建方法
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]); // 這裏放任務代碼
});
// 異步執行任務創建方法
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]); // 這裏放任務代碼
});
多線程開發之GCD