【極客班】多執行緒

weixin_34321977發表於2016-05-02

程式是作業系統結構的基礎;是一個正在執行的程式;計算機中正在執行的程式例項;可以分配給處理器並由處理器執行的一個實體;由單一順序的執行顯示,一個當前狀態和一組相關的系統資源所描述的活動單元。
執行緒,有時被稱為輕量級程式(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組成。另外,執行緒是程式中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源,但它可與同屬一個程式的其它執行緒共享程式所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程式中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中呈現出間斷性。

GCD

GCD為Grand Central Dispatch的縮寫。
Grand Central Dispatch (GCD)是Apple開發的一個多核程式設計的較新的解決方法。它主要用於優化應用程式以支援多核處理器以及其他對稱多處理系統。它是一個線上程池模式的基礎上執行的並行任務。在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用。
建立佇列:
有兩個引數,一個是名字,第二個是型別(序列或者並行)。

//序列佇列
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", DISPATCH_QUEUE_SERIAL);
//並行佇列
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", DISPATCH_QUEUE_CON

dispatch_suspend,dispatch_resume提供了“掛起、恢復”佇列的功能,簡單來說,就是可以暫停、恢復佇列上的任務。但是這裡的“掛起”,並不能保證可以立即停止佇列上正在執行的block,看如下例子:

dispatch_queue_t queue = dispatch_queue_create("me.tutuge.test.gcd", DISPATCH_QUEUE_SERIAL);
//提交第一個block,延時5秒列印。
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:5];
    NSLog(@"After 5 seconds...");
});
//提交第二個block,也是延時5秒列印
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:5];
    NSLog(@"After 5 seconds again...");
});
//延時一秒
NSLog(@"sleep 1 second...");
[NSThread sleepForTimeInterval:1];
//掛起佇列                        
NSLog(@"suspend...");
dispatch_suspend(queue);
//延時10秒                
NSLog(@"sleep 10 second...");
[NSThread sleepForTimeInterval:10];
//恢復佇列            
NSLog(@"resume...");
dispatch_resume(queue);

dispatch_apply的作用是在一個佇列(序列或並行)上“執行”多次block,其實就是簡化了用迴圈去向佇列依次新增block任務。但是我個人覺得這個函式就是個“坑”,先看看如下程式碼執行結果:

//建立非同步序列佇列
dispatch_queue_t queue = dispatch_queue_create("me.tutuge.test.gcd", DISPATCH_QUEUE_SERIAL);
//執行block3次
dispatch_apply(3, queue, ^(size_t i) {
    NSLog(@"apply loop: %zu", i);
});
//列印資訊
NSLog(@"After apply");

相關文章