iOS 多線程GCD的簡單使用

①什麼是線程?什麼是進程?安全

線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元多線程

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。異步

引用網上一個很形象的例子,一個軟件就像一個工廠,工廠裏有分管各項職能的車間(進程),可是因爲資源等因素限制,同時每次只能有一個車間(進程)工做,可是一個車間裏有許多工人(線程),能夠由他們中的一我的或由多我的組成一個團隊,由這個團隊裏的人來共同完成一項生產任務,在一個團隊(A)進行一項生產任務時,其餘團隊(B)是沒法參與該項生產任務的(此處的內存被A佔用)。async

②什麼是多核?atom

即多內核(multicore chips)是指在一枚處理器(chip)中集成兩個或多個完整的計算引擎(內核)。spa

再引用網上一個很形象的例子,好比說搬磚,給你100隻手,你把這100隻手所有裝到一我的的身上,那麼這就是多核,多核的好處顯而易見,確定比2隻手搬磚快,可是缺點就是受限於人自己(CPU),若是重量太大,人的脊柱就會被壓斷。操作系統

③爲何要使用多線程?線程

好比執行下面這段代碼code

for (int i = 0; i < 100000; i++) {
        NSLog(@"i = %d",i);
    }    
    self.view.backgroundColor = [UIColor greenColor];

咱們會發現,要在執行循環語句10萬次後,纔開始執行設置背景顏色的語句,這就是所謂的主線程卡死。htm

多線程就是讓程序在同一時間,執行多個任務。

④多線程的幾種方法

(1)NSThread              

特色:代碼量大,很麻煩,線程間通訊困難不安全

(2)NSOperation

特色:能控制線程間的通訊,但不靈活

(3)GCD

特色:調用靈活,線程間通訊簡單,支持多核且效率最高

一. GCD的原生使用

//建立子線程
    dispatch_queue_t t=dispatch_queue_create("XIAOBAIGUAN", NULL);
    //async--異步   sync--同步
    dispatch_async(t, ^{
        for (int i = 0; i< 100000;  i++) {
            NSLog(@"i - %d",i);
        }
    });

 二.GCD

https://pan.baidu.com/s/1hr928y4

#import "GCD.h"
//默認子線程
    [GCDQueue executeInGlobalQueue:^{
        //默認子線程中執行代碼
        for (int i = 0; i < 30000; i++) {
            printf("aaa\n");
        }
        //UI部分回到主線程中執行
      [GCDQueue executeInMainQueue:^{
        self.view.backgroundColor = [UIColor greenColor];
      }];
    }];

三.GCDGroup多線程組的使用

//初始化
 GCDGroup *group=[GCDGroup new];
//子線程執行,把當前子線程代碼規劃到一個組
//[GCDQueue globalQueue] - 獲取到globalQueue線程  execute-執行
    [[GCDQueue globalQueue]execute:^{
        NSLog(@"下載資料1");
        NSLog(@"資料1結束");
    } inGroup:group];
    [[GCDQueue globalQueue]execute:^{
        NSLog(@"下載資料2");
        NSLog(@"資料2結束");
        
    } inGroup:group];
//當Group裏面全部成員都執行完,會進入到這個notify方法中
    [[GCDQueue mainQueue]notify:^{
        NSLog(@"開始遊戲");
    } inGroup:group];
      
注意:子線程不是順序執行

四.GCDTimer的使用方法

@property(nonatomic,strong)GCDTimer *timer;
//timeInterval- 時間間隔
//delay       - 首次執行前的延遲
//NSEC_PER_SEC- 一秒
self.timer=[[GCDTimer alloc]initInQueue:[GCDQueue mainQueue]];
////計時器執行的代碼
    [self.timer event:^{
        NSLog(@"嘀噠嘀");
    } timeInterval:NSEC_PER_SEC * 3 delay:NSEC_PER_SEC*3];
//開始
 [self.timer start];
//結束後銷燬
 [self.timer destroy];

五.GCDSemaphore信息源的使用方法

[GCDQueue executeInGlobalQueue:^{      
        NSLog(@"執行1");      
        //等待命令
        [semaphore wait];    
        NSLog(@"執行3");      
    }];
    
    [GCDQueue executeInGlobalQueue:^{      
      NSLog(@"執行2");
        sleep(5);     
        //發出信號
        [semaphore signal];
        
    }];

這兩段代碼的執行順序以下:

相關文章
相關標籤/搜索