#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//[self concurrentAndAsync];
//[self concurrentAndSync];
[self serialAndAsync];
[self mainQueuePrintTask];
}
//主队列中的打印任务
- (void)mainQueuePrintTask {
for (int i = 0; i < 50; i++) {
NSLog(@"GCD主线程:%i", i);
}
}
//异步添加任务到并发队列,他是上下两个的位置是随机的,而且理论上for里面的打印也是随机的
- (void)concurrentAndAsync {
//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);//全局队列是所有的程序都能用的,是系统自带的队列
//异步添加两个任务到并发队列
dispatch_async(queue, ^{
for (int i = 0; i < 20; i++) {
NSLog(@"异步任务1:%i", i);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 20; i++) {
NSLog(@"异步任务2:%i", i);
}
});
}
//同步添加到并发队列,第一第二两个任务随机,但是里面则是按照小到大
- (void)concurrentAndSync {
//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//异步添加两个任务到并发队列
dispatch_sync(queue, ^{
for (int i = 0; i < 20; i++) {
NSLog(@"同步任务1:%i", i);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 20; i++) {
NSLog(@"同步任务2:%i", i);
}
});
}
//异步添加到串行队列,按顺序先执行第一个任务,再执行第二个。但是里面的打印按原理是随机的
- (void)serialAndAsync {
//创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("huiwen", DISPATCH_QUEUE_SERIAL);
//异步添加两个任务到并发队列
dispatch_async(queue, ^{
for (int i = 0; i < 20; i++) {
NSLog(@"异步任务1:%i", i);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 20; i++) {
NSLog(@"异步任务2:%i", i);
}
});
}
//同步添加到串行队列
- (void)serialAndSync {
}
- (void)createQueueTask {
dispatch_queue_t queue;
//1.创建串行队列
//queue = dispatch_queue_create("com.wxhl.serial1", NULL);//线程名字,线程类型。默认是串行
queue = dispatch_queue_create("com.wxhl.serial1", DISPATCH_QUEUE_SERIAL);
//2.创建并发队列
queue = dispatch_queue_create("com.wxhl.concurrent", DISPATCH_QUEUE_CONCURRENT);
//3.获取iOS系统已创建好的queue
//全局队列:并发队列,全程序共用
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//获取到主队列:串行队列,是当前程序的主队列
queue = dispatch_get_main_queue();
}
GCD的死锁:GCD的死锁只有在串行的时候才会发生,总的来说就是一个任务放在了串行队列中,然后自身的任务放在block中,是同步的,这时候第一个任务要自身里面的block中的任务完成才会继续进行下去,而block中的任务由于他本身也是串行同步的,他的执行需要前面的任务执行完毕,这时候就产生了死锁。
- (void)deadLock {
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//向主队列中同步追加任务,这个async也包含了非堵塞。sync包含了堵塞。,然后这个如果用sync的话就是同步阻塞,然后要等任务完成才会继续执行,这个任务挂起,等Block任务完成,然后返回才会继续执行,但是因为是同步所以block这个任务完成要等前面的任务完成才行。
dispatch_async(mainQueue, ^{
NSLog(@"block追加任务");
});
//主队列中打印任务
for (int i = 0; i < 10; i++) {
NSLog(@"GCD主线程:%i", i);
}
}