这些术语描述当任务相对于其它任务被执行,任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行。
- (void)viewDidLoad
{
[superviewDidLoad];
NSLog(@"thread = %@ ", [NSThreadcurrentThread]);
dispatch_queue_t q =dispatch_queue_create("com.wzh.test",NULL);
for (int i =0; i<10; ++i) {
dispatch_async(q, ^{
NSLog(@"block%d add queue %@", i, [NSThreadcurrentThread]);
});
}
NSLog(@"ViewDidLoad");
}执行的结果如下:
2015-07-02 14:32:33.639 gcd_test[1174:69094] thread = <NSThread: 0x7b678180>{number = 1, name = main}
2015-07-02 14:32:33.639 gcd_test[1174:69094] ViewDidLoad
2015-07-02 14:32:33.639 gcd_test[1174:69182] block0 add queue <NSThread: 0x7b68f7a0>{number = 2, name = (null)}
2015-07-02 14:32:33.640 gcd_test[1174:69094] ViewDidLoad
2015-07-02 14:32:33.640 gcd_test[1174:69182] block1 add queue <NSThread: 0x7b68f7a0>{number = 2, name = (null)}
2015-07-02 14:32:33.640 gcd_test[1174:69182] block2 add queue <NSThread: 0x7b68f7a0>{number = 2, name = (null)}
可以看到 ViewDidLoad的打印结果在前面,说明一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成
我们再看一下dispatch_sync同步函数的执行结果:
2015-07-02 14:35:44.333 gcd_test[1191:70132] thread = <NSThread: 0x7bf85cd0>{number = 1, name = main}
2015-07-02 14:35:44.334 gcd_test[1191:70132] block0 add queue <NSThread: 0x7bf85cd0>{number = 1, name = main}
2015-07-02 14:35:44.334 gcd_test[1191:70132] block1 add queue <NSThread: 0x7bf85cd0>{number = 1, name = main}
2015-07-02 14:35:44.335 gcd_test[1191:70132] block2 add queue <NSThread: 0x7bf85cd0>{number = 1, name = main}
2015-07-02 14:35:44.336 gcd_test[1191:70132] ViewDidLoad
一个同步函数只在完成了它预定的任务后才返回。也就是说同步函数dispatch_sync阻塞了当前的线程。
在异步任务(dispatch_async)的时候,如果这个队列是串行的队列,队列中任务取出一个,等新的线程执行完毕执行完之后,再取出串行队列中的另一个任务,再由新的线程开始执行。这个感觉挺好理解的。
假如说这个队列是并行队列,假如说有5个线程要执行并行队列中任务,将队列中的任务取出一个,给一个线程。然后,第二个任务不等待第一个任务结束,就取出来给另一个线程。就是说,之所以叫并发队列,就是因为依次取出了好几个任务吗?而不是一个任务完成,再取另一个任务?
刚开始,任务的执行是有顺序的,但是至于谁先执行完是不可预知的