GCD之异步同步体会
前面的博文也有写到同步异步,可能是看他人的博文,自己没有实验,感觉理解不深,所以就敲了些代码比较一下串行、并行分别对应的同步、异步。
1.首先创建串行、并行线程队列
1
2
|
dispatch_queue_t serialqueue=dispatch_queue_create( "serialqueue" , DISPATCH_QUEUE_SERIAL); //串行线程队列 dispatch_queue_t concurrentqueue=dispatch_queue_create( "concurrent" , DISPATCH_QUEUE_CONCURRENT); //并行线程队列 |
2.并行线程队列的同步、异步的比较
1
2
3
4
5
6
7
8
9
|
dispatch_async(concurrentqueue, ^{ NSLog (@ "5a" ); }); NSLog (@ "6a" ); dispatch_sync(concurrentqueue, ^{ NSLog (@ "5" ); }); NSLog (@ "6" ); |
运行结果:6a和5a的顺序不定, 5 和6的顺序始终是一样的
将上面的代码稍微修改,分别改为都是同步、都是异步、一个同步一个异步四种情况,运行查看结果基本能体会出同步的异步的区别。
3.串行线程队列的同步异步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
dispatch_async(serialqueue, ^{ NSLog (@ "5a" ); }); dispatch_async(serialqueue, ^{ NSLog (@ "5aa" ); }); dispatch_async(serialqueue, ^{ NSLog (@ "5a1" ); }); NSLog (@ "6a" ); dispatch_sync(serialqueue, ^{ NSLog (@ "5" ); }); NSLog (@ "6" ); |
运行结果:
同样多改变同步异步方式,多测试一下,就能感受体会到同步异步的区别。
个人体会:同步:则会阻塞当前线程,等待block添加到指定的线程运行完才返回。异步则不会阻塞当前线程,block则会在后台添加到指定的线程运行。