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:异步任务无论在自定义串行队列、自定义并行队列(主队列除外,主队列下,任务会在主线中串行执行)、全局队列 执行任务时,都会创建子线程,并且在子线程中执行;