前言:Queue队列分为几下几种
1、全局队列:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2、主队列:dispatch_get_main_queue()
3、用户创建的串行队列:
dispatch_queue_create(“com.yuna.com”, DISPATCH_QUEUE_SERIAL/NULL);
4、用户创建的并行队列:
dispatch_queue_create(“com.yuna.com”, DISPATCH_QUEUE_CONCURRENT);
同步与异步的区别:dispatch_sync 和 dispatch_async
dispatch_sync(queue,block):同步队列,dispatch_sync 函数不会立即返回,会阻塞当前线程,将block放到指定的queue上面执行,等待该block同步执行完成后才会返回
dispatch_async(queue,block):异步队列,dispatch_async 函数会立即返回,block放到指定queue中等待执行,该block是并行还是串行只跟queue定义有关
……………………………………………………………………………………
一个NSThread线程对象都可以有它对应的名字(name)和编号(number). 名字可以通过NSThread的name属性来设置
编号(number)是不能设置的,一般由系统决定,但主线程默认就是1,只要不为1的就是子线程
我们看下他们的几种组合情况
1、串行队列+同步
/*
串行队列 + 同步任务:没有开启新线程,任务是逐个完成的
*/
- (void)serialSync{
dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_SERIAL);
// dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", NULL);
//在队列里添加同步任务
dispatch_sync(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---1--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---2--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---3--%@",[NSThread currentThread]);
}
});
}
我们看下打印的结果:都是在同一个线程执行,没有开启新线程,而且是任务逐个执行的
2、 串行队列 + 异步
/*
串行队列 + 异步任务:开启新线程,任务是逐个完成的
*/
- (void)serialAsync{
dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_SERIAL);
// dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", NULL);
NSLog(@"串行队列 + 异步----%@",[NSThread currentThread]);
//在队列里添加异步任务
dispatch_async(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---1--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---2--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---3--%@",[NSThread currentThread]);
}
});
}
我们看下打印的结果:有个主线程,还开启了一个新的进程,任务是逐一执行的
3、 并发队列 + 同步
/*
并发队列 + 同步任务 :没有开启新线程,任务是逐个执行
*/
-(void)createConCurrentQueueSyn{
//创建并发队列
dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"并发队列 + 同步----%@",[NSThread currentThread]);
//在队列里添加同步任务
dispatch_sync(queue, ^{
for(int i=0 ; i
我们看下打印的结果:都是在同一个线程中,没有开启一个新的进程,任务是逐一执行的
4、 并发队列 + 异步
/*
并发队列 + 异步任务 :开启新线程,任务是并发的
--1--{number = 2, name = (null)}
--2--{number = 3, name = (null)}
--3--{number = 4, name = (null)}
*/
-(void)createConCurrentQueueAsyn{
dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"并发队列 + 异步----%@",[NSThread currentThread]);
//队列中添加异步任务
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"--1--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"--2--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"--3--%@",[NSThread currentThread]);
}
});
}
我们看下打印的结果:正常打印的是在主线程中执行,而dispatch_async中是block是在开启的新线程中并发执行的
5、全局队列 + 同步
/*
全局队列 + 同步任务:,没有开启新线程,任务逐个执行
*/
-(void)GlabolSyc{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"全局队列 + 同步----%@",[NSThread currentThread]);
//在队列里添加同步任务
dispatch_sync(queue, ^{
for(int i=0 ; i
我们看下打印的结果:都是在同一个线程中执行的,并且是逐个执行
6、全局 + 异步
/*
全局 + 异步:开启新线程,任务是并发的
*/
- (void)GlobalAsync{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"全局队列 + 异步----%@",[NSThread currentThread]);
//队列中添加异步任务
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"--1--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"--2--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"--3--%@",[NSThread currentThread]);
}
});
}
我们看下打印的结果:正常打印的是在主线程中执行,而dispatch_async中是block是在开启的新线程中并发执行的
7、 主队列+同步:运行后直接crash
/*
主队列(串行)+同步:界面卡死
主队列中添加同步任务会造成死锁的
*/
- (void)mainthreadSync{
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"主队列(串行)+同步----%@",[NSThread currentThread]);
//在队列里添加同步任务
dispatch_sync(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---1--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---2--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for(int i=0 ; i<10;i++){
NSLog(@"---3--%@",[NSThread currentThread]);
}
});
}
8、主队列+异步
/*
主队列(串行)+异步:没有创建新线程,任务逐个完成 {都是在主线程中执行的}
*/
- (void)mainthreadAsync{
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"主队列(串行)+异步----%@",[NSThread currentThread]);
//在队列里添加异步任务
dispatch_async(queue, ^{
for(int i=0 ; i
总结:
任务:执行什么操作
同步:只能在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新线程的能力
主要区别:能否开启新的线程
………………………………………………………………
队列:用来存放任务 (FIFO)
并行队列:1、可以让多个任务并发(同时)执行(自动开启多个线程 同时执行任务)
2、并发的功能只有在异步函数下才有效
方式一:dispatch_queue_create(“com.pi2e.com”,DISPATCH_QUEUE_CONCURRENT);
方式二:dispatch_get_global_queue
……………………………………………………………………
串行队列:让任务一个接着一个的执行(也就是说必须等一个任务执行完毕后才可执行下一个任务)
方式一:dispatch_create_queue(“com.pi2e.com”,DISPATCH_QUEUE_SEARIAL/NULL)
方式二:dispatch_get_main_queue();
注意:主队列是GCD自带的一种特殊的串行队列,放置到主队列的任务,都会在主线程中执行
主要区别:任务的执行方式不同