GCD:串行/并行/主队列下,同步/异步的执行方式

GCD中获取各种类型的队列:

1
2
3
4
5
6
7
8
//获取串行的队列
dispatch_queue_t singalQueue = dispatch_queue_create("single",DISPATCH_QUEUE_SERIAL);
//获取并发执行的队列
dispatch_queue_t concrtQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//获取全局的队列(并发的)
dispatch_queue_t gobalqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

串行队列异步执行任务
  1. 异步具有创建新线程的能力,会开辟新线程去执行任务;
  2. 按照串行的方式去执行任务。

如下调用方式可参考:

1
2
3
4
5
6
- (void)singalAsynQueue{
//创建串行队列
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
//在singalQueue中异步执行任务(该方法实现在本文后续中)
[self asynWithQueue: singalQueue];
}

串行队列同步执行任务
  1. 同步不具有创建新的线程的能力, 不会开辟新的线程去执行任务,会在当前的程序的主线程中去执行任务;
  2. 按照串行的方式去执行任务。

如下调用方式可参考:

1
2
3
4
5
6
- (void)singalSynQueue{
//创建串行队列
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
//在singalQueue中同步执行任务(该方法实现在本文后续中)
[self synWithQueue: singalQueue];
}

并发队列异步执行任务(常用)
  1. 异步具有创建新的线程的能力,会开辟新的线程去执行任务,不会在当前的程序的主线程中去执行任务;
  2. 按照并发的方式去执行任务。

如下调用方式可参考:

1
2
3
4
5
6
7
8
- (void)concrtAsynQueue{
//创建并发执行的队列
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//获取全局的队列
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在concrtQueue中异步执行任务(该方法实现在本文后续中)
[self asynWithQueue:concrtQueue];
}

并发队列同步执行任务
  1. 同步不具有创建新的线程的能力, 不会开辟新的线程去执行任务,会在当前的程序的主线程中去执行任务;
  2. 按照同步的方式去执行任务。

如下调用方式可参考:

1
2
3
4
5
6
7
8
- (void)concrtSynQueue{
//创建并发执行的队列
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//获取全局的队列
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在concrtQueue中同步执行任务(该方法实现在本文后续中)
[self synWithQueue:concrtQueue];
}

主队列的同步(会造成程序的死锁)

如下:

1
2
3
4
5
6
- (void)mainSynQueue{
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在mainQueue中同步执行任务(该方法实现在本文后续中)
[self synWithQueue:mainQueue];
}

主队列的异步(在主线程中顺序执行)

新添加到主队列中的任务会放到队列的最尾部,等到当前主线程中的任务结束之后然后再从队列的头部取出依次执行(FIFO)先进先出。

如下调用方式可参考:

1
2
3
4
5
6
- (void)mainAsynQueue{
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在mainQueue中异步执行任务(该方法实现在本文后续中)
[self asynWithQueue:mainQueue];
}

异步方法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)asynWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_async(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}

同步方法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)synWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}

-------------本文结束感谢您的阅读-------------