GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行

1、涉及相关概念
1.1、同步、异步
1.2、自定义串行队列、自定义并行队列、全局队列、主队列
1.3、主线程、子线程

2、示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{
    dispatch_queue_t serialQueue = dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
 
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
    //1:
    for(int i=0;i<10;i++){
        dispatch_sync(serialQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,同步任务在串行队列中,在主线程下串行执行
 
    //2:
    for(int i=0;i<10;i++){
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,同步任务在并行队列中,在主线程下串行执行
 
    //3:
    for(int i=0;i<10;i++){
        dispatch_sync(mainQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,同步任务在主队列中,锁死
 
    //4:
    for(int i=0;i<10;i++){
        dispatch_sync(globalQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,同步任务在全局队列中,在主线程下串行执行
 
    //5:
    for(int i=0;i<10;i++){
        dispatch_async(serialQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,异步任务在串行队列中,在一个子线程中串行执行
 
    //6:
    for(int i=0;i<10;i++){
        dispatch_async(concurrentQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,异步任务在并行队列中,在多个子线程中并行执行
 
    //7:
    for(int i=0;i<10;i++){
        dispatch_async(mainQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,异步任务在主队列中,在主线程中串行执行
 
    //8:
    for(int i=0;i<10;i++){
        dispatch_async(globalQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,异步任务在全局队列中,在多个子线程中并行执行
}

3、结论
3.1、dispatch_sync:同步任务无论在自定义串行队列、自定义并行队列、主队列(当前线程为主线程时会出现死锁)、全局队列 执行任务时,都不会创建子线程,而是在当前线程中串行执行;
3.2、dispatch_async:异步任务无论在自定义串行队列、自定义并行队列(主队列除外,主队列下,任务会在主线中串行执行)、全局队列 执行任务时,都会创建子线程,并且在子线程中执行;

Leave a Reply