在之前的文章中也介绍到了串行以及并行,这次是关于串行队列的详细介绍
串行队列
GCD核心概念
将任务添加对象,指定任务执行的方法任务
使用block封装
block就是一个提前准备好的代码块,在需要的时候执行队列(负责调度任务)
串行:一个接一个的调度任务
并发:可以同时调度多个任务任务执行函数(任务都需要在线程中执行!!)
同步执行:当前指令不完成,不会执行下一个指令
异步执行:当前指令不完成,不会等待,继续执行下一条指令
串行队列,同步(单)任务
- 代码
//MARK:串行队列,同步任务
-(void)GCDSerialQueuesOne
{
//1.队列-串行
/*
参数1:队列名称
参数2:队列属性 DISPATCH_QUEUE_SERIAL 串行,等价于NULL
*/
dispatch_queue_t queue = dispatch_queue_create("CC_queue",NULL);
//2.同步执行任务
dispatch_sync(queue,^{
NSLog(@"%@",[NSThread currentThread]);
});
}
- 运行结果
2017-11-16 13:37:52.851865+0800 GCDDome-串行队列[4297:2548551] <NSThread: 0x1c406a8c0>{number = 1, name = main}
串行队列,同步(多)任务
//MARK:串行队列,同步任务
-(void) GCDSerialQueuesTwo
{
//1.队列-串行
/*
参数1:队列名称
参数2:队列属性 DISPATCH_QUEUE_SERIAL 串行,等价于NULL
*/
dispatch_queue_t q = dispatch_queue_create("CC_queue",NULL);
//2.同步执行任务
for(int i = 0;i < 10;i++)
{
dispatch_sync(q,^{
NSLog(@"%@",[NSThread currentThread]);
});
}
}
- 运行结果
2017-11-16 14:00:15.840543+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
2017-11-16 14:00:15.840598+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
2017-11-16 14:00:15.840621+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
2017-11-16 14:00:15.840641+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
2017-11-16 14:00:15.840661+0800 GCDDome-串行队列
- 总结
不会开启线程
顺序执行,只有1个线程,任务是按照队列顺序来的。所以是顺序执行
串行队列,异步任务
//MARK:串行队列,异步任务
-(void)GCDSerialQueuesThree
{
//1.队列-串行
/*
参数1:队列名称
参数2:队列属性 DISPATCH_QUEUE_SERIAL 串行,等价于NULL
*/
dispatch_queue_t q = dispatch_queue_create("CC_queue",NULL);
//2.异步执行任务 async
for(int i = 0;i < 10;i++)
{
dispatch_async(q,^{
NSLog(@"%@",[NSThread currentThread]);
});
}
//它在主线程
NSLog(@"come here 我在主线程");
}
- 运行结果
2017-11-16 14:06:45.127890+0800 GCDDome-串行队列[4312:2560061] come here 我在主线程
2017-11-16 14:06:45.127958+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
2017-11-16 14:06:45.128348+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
2017-11-16 14:06:45.128392+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
2017-11-16 14:06:45.128418+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
2017-11-16 14:06:45.129258+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
2017-11-16 14:06:45.129293+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
- 总结
只会开一条线程
顺序执行,只有1个线程,任务是按照队列顺序来的。所以是顺序执行