GCD基礎知識

IOS使用多線程有三種方法NSThread、NSOperation和NSOperationQueue、GCD;多線程

GCD學習(一)併發


(1)異步和同步
異步

dispatch_sync(queue, ^{
            NSLog(@"這是同步線程");
        });
        
        dispatch_async(queue, ^{
            NSLog(@"這是異步線程");
        });


(2)並行隊列和串行隊列async

//並行隊列
    //dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//系統默認的並行隊列
    dispatch_queue_t concurrentQuueue = dispatch_queue_create("com.itt.crq", DISPATCH_QUEUE_CONCURRENT);//自定義並行隊列
    dispatch_async(concurrentQuueue, ^{
        
        NSLog(@"task1");
    });
    dispatch_async(concurrentQuueue, ^{
        
        NSLog(@"task2");
    });
    
    
    //串行隊列
    dispatch_queue_t serialQueue = dispatch_queue_create("con.itt.srq", DISPATCH_QUEUE_SERIAL);
    dispatch_async(serialQueue, ^{
        
        NSLog(@"task1");
    });
    dispatch_async(serialQueue, ^{
        
        NSLog(@"task2");
    });


(3)任務組學習

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, myQueue, ^{

        NSLog(@"task1");
    });
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"task1");
    });
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"task3");
    });
    
    NSLog(@"wait 1 2 3");
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    NSLog(@"task 1 2 3 finished");


(4)dispatch_group_enter、dispatch_group_leave和dispatch_group_wait來實現進程同步spa

//dispatch_group_enter和dispatch_group_leave必須成對出現
    dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_enter(group);
    
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"again");
        
        sleep(5);
        
        dispatch_group_leave(group);
    });
    
    
    dispatch_group_enter(group);
    
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"next");
        
        sleep(10);
        
        dispatch_group_leave(group);
    });
    
    NSLog(@"start");
    NSLog(@"waiting");
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//dispatch_group_wait表示等待任務組執行完畢
    
    NSLog(@"finish");


(5)信號量(控制併發)線程

實例一:

dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    for (int i = 0; i < 100; i++)
    {
        
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%i",i);
            
            sleep(2);
            dispatch_semaphore_signal(semaphore);
        });
    }
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    
 實例二:
 
 
 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_async(queue, ^{
    
        
        
        NSLog(@"waiting create data");
        
        sleep(5);
        
        NSLog(@"create data complete");
        
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_async(queue, ^{
        
        
        
        NSLog(@"haha~,I am get data complete");
        
    });

實例一程序運行會先建立10個新的線程,以後每當有線程執行結束,都會建立一個線程;實例二5秒後輸出「haha~,I am get data complete」。code

相關文章
相關標籤/搜索