/**
1.GCD的队列:
串行队列:让任务一个接着一个地执行(一个任务执行完毕之后,再执行下一个任务)
并行队列:可以让多个任务同时执行(GCD开启多个线程同时执行任务)
可以同时调度多个任务执行
并发功能只有在异步(dispatch_async)函数下在有效
主队列:
主队列中的任务,只有在主线程空闲的时候才会被调度执行。如果主线程上又代码执行,主队列不会调度任务
2.GCD中2个用来执行任务的函数
同步的方式执行任务:
在当前线程中依次的执行任务
异步的方式执行任务:
开辟新开线程,在新线程中执行任务
如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度线程执行异步任务
如果没有,就会创建新的线程去执行任务。
*/
#import "ViewController.h"
@interfaceViewController ()
@end
@implementation ViewController
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[selfdemo07];
}
//同步任务+串行队列
//总结:
//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。
//队列中的任务有序执行:
-(void) demo01{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:01:53.897 关于GCD的一些总结[2437:73550] start1
2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] end1
2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] aaaaa
2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] start2
2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] end2
2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] bbbb
2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] start3
2015-12-14 12:01:57.412 关于GCD的一些总结[2437:73550] end3
*/
//异步任务+串行队列
//总结:
//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。
//队列中的任务有序执行:当前线程将任务添加到了串行队列,当子线程去执行任务的时候,也只能一个一个的取出来执行
-(void) demo02{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_async(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_async(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74099] start1
2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74064] aaaaa
2015-12-14 12:02:29.505 关于GCD的一些总结[2452:74064] bbbb
2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] end1
2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] start2
2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] end2
2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] start3
2015-12-14 12:02:33.018 关于GCD的一些总结[2452:74099] end3
*/
//同步任务+并发队列
//总结:
//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。
//队列中的任务有序执行:
-(void) demo03{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:04:33.057 关于GCD的一些总结[2476:75282] start1
2015-12-14 12:04:35.062 关于GCD的一些总结[2476:75282] end1
2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] aaaaa
2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] start2
2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] end2
2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] bbbb
2015-12-14 12:04:36.069 关于GCD的一些总结[2476:75282] start3
2015-12-14 12:04:36.573 关于GCD的一些总结[2476:75282] end3
*/
//异步任务+并发队列
//总结:
//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。
//无序:当前线程添加任务,因为是并发队列,系统会调度多个子线程去执行任务
-(void) demo04{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_async(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_async(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] aaaaa
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75901] start1
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] bbbb
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75902] start2
2015-12-14 12:05:23.010 关于GCD的一些总结[2492:75900] start3
2015-12-14 12:05:23.515 关于GCD的一些总结[2492:75900] end3
2015-12-14 12:05:24.015 关于GCD的一些总结[2492:75902] end2
2015-12-14 12:05:25.013 关于GCD的一些总结[2492:75901] end1
*/
//同步任务+主队列=死锁
//总结:当将任务添加到主队列后,主线程等待任务被执行完毕。
//在主队列中的任务等待主线程空闲的时候被调度。它们之间的相互等待造成了死锁
-(void) demo05{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
//异步任务+主队列
//总结:主线程添加完第一个任务之后,会立刻添加后面的任务,
//在主队列中的任务在等待着主线程空闲,主线程空闲之后就去执行主队列中的任务
-(void) demo06{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:06:12.769 关于GCD的一些总结[2508:76537] aaaaa
2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] bbbb
2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] start1
2015-12-14 12:06:14.771 关于GCD的一些总结[2508:76537] end1
2015-12-14 12:06:14.772 关于GCD的一些总结[2508:76537] start2
2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] end2
2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] start3
2015-12-14 12:06:16.274 关于GCD的一些总结[2508:76537] end3
*/
//死锁的解决方案:将同步任务+主队列放在子线程中
//总结:现在子线程负责添加任务,主线程空闲着,可以去执行主队列中的任务
-(void) demo07{
dispatch_async(dispatch_get_global_queue(0,0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
});
}
/*
2015-12-14 12:06:42.841 关于GCD的一些总结[2521:77234] start1
2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77234] end1
2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77266] aaaaa
2015-12-14 12:06:44.844 关于GCD的一些总结[2521:77234] start2
2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77234] end2
2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77266] bbbb
2015-12-14 12:06:45.846 关于GCD的一些总结[2521:77234] start3
2015-12-14 12:06:46.347 关于GCD的一些总结[2521:77234] end3
*/
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
/**
1.GCD的队列:
串行队列:让任务一个接着一个地执行(一个任务执行完毕之后,再执行下一个任务)
并行队列:可以让多个任务同时执行(GCD开启多个线程同时执行任务)
可以同时调度多个任务执行
并发功能只有在异步(dispatch_async)函数下在有效
主队列:
主队列中的任务,只有在主线程空闲的时候才会被调度执行。如果主线程上又代码执行,主队列不会调度任务
2.GCD中2个用来执行任务的函数
同步的方式执行任务:
在当前线程中依次的执行任务
异步的方式执行任务:
开辟新开线程,在新线程中执行任务
如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度线程执行异步任务
如果没有,就会创建新的线程去执行任务。
*/
#import "ViewController.h"
@interfaceViewController ()
@end
@implementation ViewController
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[selfdemo07];
}
//同步任务+串行队列
//总结:
//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。
//队列中的任务有序执行:
-(void) demo01{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:01:53.897 关于GCD的一些总结[2437:73550] start1
2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] end1
2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] aaaaa
2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] start2
2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] end2
2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] bbbb
2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] start3
2015-12-14 12:01:57.412 关于GCD的一些总结[2437:73550] end3
*/
//异步任务+串行队列
//总结:
//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。
//队列中的任务有序执行:当前线程将任务添加到了串行队列,当子线程去执行任务的时候,也只能一个一个的取出来执行
-(void) demo02{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_async(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_async(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74099] start1
2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74064] aaaaa
2015-12-14 12:02:29.505 关于GCD的一些总结[2452:74064] bbbb
2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] end1
2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] start2
2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] end2
2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] start3
2015-12-14 12:02:33.018 关于GCD的一些总结[2452:74099] end3
*/
//同步任务+并发队列
//总结:
//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。
//队列中的任务有序执行:
-(void) demo03{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:04:33.057 关于GCD的一些总结[2476:75282] start1
2015-12-14 12:04:35.062 关于GCD的一些总结[2476:75282] end1
2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] aaaaa
2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] start2
2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] end2
2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] bbbb
2015-12-14 12:04:36.069 关于GCD的一些总结[2476:75282] start3
2015-12-14 12:04:36.573 关于GCD的一些总结[2476:75282] end3
*/
//异步任务+并发队列
//总结:
//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。
//无序:当前线程添加任务,因为是并发队列,系统会调度多个子线程去执行任务
-(void) demo04{
dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_async(queue, ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_async(queue, ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] aaaaa
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75901] start1
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] bbbb
2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75902] start2
2015-12-14 12:05:23.010 关于GCD的一些总结[2492:75900] start3
2015-12-14 12:05:23.515 关于GCD的一些总结[2492:75900] end3
2015-12-14 12:05:24.015 关于GCD的一些总结[2492:75902] end2
2015-12-14 12:05:25.013 关于GCD的一些总结[2492:75901] end1
*/
//同步任务+主队列=死锁
//总结:当将任务添加到主队列后,主线程等待任务被执行完毕。
//在主队列中的任务等待主线程空闲的时候被调度。它们之间的相互等待造成了死锁
-(void) demo05{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
//异步任务+主队列
//总结:主线程添加完第一个任务之后,会立刻添加后面的任务,
//在主队列中的任务在等待着主线程空闲,主线程空闲之后就去执行主队列中的任务
-(void) demo06{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
}
/*
运行结果:
2015-12-14 12:06:12.769 关于GCD的一些总结[2508:76537] aaaaa
2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] bbbb
2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] start1
2015-12-14 12:06:14.771 关于GCD的一些总结[2508:76537] end1
2015-12-14 12:06:14.772 关于GCD的一些总结[2508:76537] start2
2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] end2
2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] start3
2015-12-14 12:06:16.274 关于GCD的一些总结[2508:76537] end3
*/
//死锁的解决方案:将同步任务+主队列放在子线程中
//总结:现在子线程负责添加任务,主线程空闲着,可以去执行主队列中的任务
-(void) demo07{
dispatch_async(dispatch_get_global_queue(0,0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start1");
[NSThreadsleepForTimeInterval:2.0f];
NSLog(@"end1");
});
NSLog(@"aaaaa");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start2");
[NSThreadsleepForTimeInterval:1.0f];
NSLog(@"end2");
});
NSLog(@"bbbb");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"start3");
[NSThreadsleepForTimeInterval:0.5f];
NSLog(@"end3");
});
});
}
/*
2015-12-14 12:06:42.841 关于GCD的一些总结[2521:77234] start1
2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77234] end1
2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77266] aaaaa
2015-12-14 12:06:44.844 关于GCD的一些总结[2521:77234] start2
2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77234] end2
2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77266] bbbb
2015-12-14 12:06:45.846 关于GCD的一些总结[2521:77234] start3
2015-12-14 12:06:46.347 关于GCD的一些总结[2521:77234] end3
*/
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end