1,简单的写法
//dispatch_get_global_queue(0, 0)是全局并发队列,后面括号内是要执行的任务
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"task %@",[NSThread currentThread]);
});
//输出后可以看见,线程的复用,能够避免线程重复的创建和销毁,节省时间和空间;不用我们管理线程的生命周期
for (int i = 0; i < 20; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"task %@ %d",[NSThread currentThread],i);
});
}
2,知识点
并发队列:(1)可以让多个任务同时执行,自动开启多个线程;(2)只有在异步函数下才有效;
串行队列:让任务一个接着一个执行
主队列:特殊的串行队列,代表主线程
同步操作:在当前线程中执行任务,不具备开启新线程的能力;
异步操作:在新的线程中执行任务,具备开启新线程的能力;
3,串行队列的操作
(1)串行队列的同步操作
//不开线程,在当前线程下执行
//任务是有序执行的
-(void)demo{
//创建串行队列
//参数1:队列的名字
//参数2:队列的属性
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
for (int i =0; i<20; i++) {
dispatch_sync(serialQueue, ^{
NSLog(@"serialQueue %@ %d",[NSThread currentThread],i);
});
}
}
(2)串行队列的异步操作
//开一个线程
//任务是有序执行的
-(void)demo{
//创建串行队列
//参数1:队列的名字
//参数2:队列的属性
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
for (int i =0; i<20; i++) {
dispatch_async(serialQueue, ^{
NSLog(@"serialQueue %@ %d",[NSThread currentThread],i);
});
}
}
4,并行队列的操作
(1)并行队列,异步执行
//开多个线程
//任务无序执行
//效率最大
-(void)demo1{
//生成并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 20; i++) {
dispatch_async(concurrentQueue, ^{
NSLog(@"con %@ %d",[NSThread currentThread],i);
});
}
}
(2)并行队列同步操作
//不开线程,在当前线程下执行
//任务顺序执行
//等于串行队列,同步执行
-(void)demo{
//生成并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 20; i++) {
dispatch_sync(concurrentQueue, ^{
NSLog(@"con %@ %d",[NSThread currentThread],i);
});
}
}
总结:开不开线程是由:同步操作(不开启线程)和异步操作(开启线程)
4,主队列的操作
主队列之能够在异步执行,任务顺序执行;
不能够在同步执行,会造成死锁;