1. 程式人生 > >iOS-GCD的序列佇列和並行佇列的任務及實現

iOS-GCD的序列佇列和並行佇列的任務及實現

•什麼是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(

"ck", DISPATCH_QUEUE_SERIAL);

// 迴圈建立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);

    }   

}