iOS-GCD的序列佇列和並行佇列的任務及實現
GCD全稱是GrandCentral Dispatch,純C語言的,提供了非常多強大的函式 •GCD的優勢 1,GCD是蘋果公司為多核的並行運算提出的解決方案 2,GCD會自動利用更多的CPU核心(比如雙核、四核) 3,GCD會自動管理執行緒的生命週期(建立執行緒、排程任務、銷燬執行緒) 4,程式設計師只需要告訴GCD想要執行什麼任務,不需要編寫任何執行緒管理程式碼 •GCD的核心:將任務新增到佇列 •任務:執行什麼操作 •佇列:用來存放任務 •GCD使用的兩個步驟 •建立任務:確定要做的事情 •GCD中的任務是使用BLOCK封裝的 •將任務新增到佇列中 •GCD會自動將佇列中的任務取出,放到對應的執行緒中執行 •任務的取出遵循佇列的FIFO原則:先進先出,後進後出 •GCD的佇列可以分為2大型別 •序列佇列(SerialDispatch Queue)
#pragma mark - 序列佇列+非同步任務
// 開執行緒,因為任務是非同步的,只開一個
// 有序
- (void)GCDDemo1
{
// 建立序列佇列
// 引數1 : 佇列的標示符
// 引數2 : 佇列的屬性,決定了佇列是序列的還是並行的 SERIAL : 序列
dispatch_queue_t queue = dispatch_queue_create("ck", DISPATCH_QUEUE_SERIAL);
for (int i = 0; i < 10; i++) {
//
void (^task)() = ^{
NSLog(@"%d %@",i, [NSThreadcurrentThread]);
};
// 將任務新增到佇列
dispatch_async(queue, task);
}
}
#pragma mark - 序列佇列+同步任務
// 不開執行緒,因為任務是同步的,只在當前執行緒執行
// 有序,因為佇列是序列的.還因為任務是同步的
- (void)GCDDemo1
{
// 建立序列佇列
dispatch_queue_t queue = dispatch_queue_create(
// 迴圈建立10個同步任務,將10個同步任務新增到序列佇列中
for (int i = 0; i < 10; i++) {
// 建立任務
void (^task)() = ^{
NSLog(@"%d %@",i,[NSThreadcurrentThread]);
};
// 將同步任務新增到序列佇列
dispatch_sync(queue, task);
}
}
•併發佇列(Concurrent Dispatch Queue) •可以讓多個任務併發(同時)執行(自動開啟多個執行緒同時執行任務) •併發功能只有在非同步(dispatch_async)函式下才有效
#pragma mark - 併發佇列+非同步任務
// 開執行緒,因為任務是非同步的
// 無序,多個任務要併發執行必須要滿足,任務是非同步的.佇列是併發的
- (void)GCDDemo1
{
// 建立併發佇列
dispatch_queue_t queue = dispatch_queue_create("ck", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
// 建立任務
void (^task)() = ^{
NSLog(@"%d %@",i,[NSThreadcurrentThread]);
};
// 將非同步任務新增到併發佇列
dispatch_async(queue, task);
}
}
#pragma mark - 併發佇列+同步任務
// 不開,因為任務是同步的,只在當前執行緒執行,而且當前執行緒是主執行緒
// 有序,是因為任務是同步的,只在當前執行緒執行,不開執行緒,執行緒只有一個任務必須有序的
- (void)GCDDemo1
{
// 建立併發佇列
dispatch_queue_t queue = dispatch_queue_create("ck", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
// 建立同步的任務
void (^task)() = ^{
NSLog(@"%d %@",i,[NSThreadcurrentThread]);
};
// 將同步任務新增到併發佇列
dispatch_sync(queue, task);
}
}