iOS-多线程-GCD

来源:互联网 发布:快跑者抢单软件 编辑:程序博客网 时间:2024/06/05 13:24

一,GCD
1,什么是GCD
GCD是苹果公司为多核的并行运算提出的解决方案
GCD会自动利用更多的CPU内核(比如双核,四核)
GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程)
程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

2,GCD加入了任务和队列两个概念:
任务:
同步执行:在当前任务执行,不会另开线程
异步执行:会开线程,在另外线程执行
队列:
串行:先进先出,一个一个执行
并行:同步任务,一个一个执行;异步任务,开线程,一起执行

3,代码:
(1)用异步函数往并发队列中添加任务
总结:同时开启三个子线程

  //1.获得全局的并发队列    dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    //2.添加任务到队列中,就可以执行任务    //异步函数:具备开启新线程的能力    dispatch_async(queue, ^{        NSLog(@"下载图片1----%@",[NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载图片2----%@",[NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载图片3----%@",[NSThread currentThread]);    });    //打印主线程    NSLog(@"主线程----%@",[NSThread mainThread]);

(2)用异步函数往串行队列中添加任务
总结:会开启线程,但是只开启一个线程

//打印主线程    NSLog(@"主线程----%@",[NSThread mainThread]);    //创建串行队列    dispatch_queue_t  queue= dispatch_queue_create("wendingding", NULL);    //第一个参数为串行队列的名称,是c语言的字符串    //第二个参数为队列的属性,一般来说串行队列不需要赋值任何属性,所以通常传空值(NULL)    //2.添加任务到队列中执行    dispatch_async(queue, ^{        NSLog(@"下载图片1----%@",[NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载图片2----%@",[NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载图片3----%@",[NSThread currentThread]);    });

(3)用同步函数往并发队列中添加任务
总结:不会开启新的线程,并发队列失去了并发的功能

 //打印主线程    NSLog(@"主线程----%@",[NSThread mainThread]);    //创建串行队列    dispatch_queue_t  queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    //2.添加任务到队列中执行    dispatch_sync(queue, ^{        NSLog(@"下载图片1----%@",[NSThread currentThread]);    });    dispatch_sync(queue, ^{        NSLog(@"下载图片2----%@",[NSThread currentThread]);    });    dispatch_sync(queue, ^{        NSLog(@"下载图片3----%@",[NSThread currentThread]);    });

(4)用同步函数往串行队列中添加任务
总结:不会开启新的线程

NSLog(@"用同步函数往串行队列中添加任务");    //打印主线程    NSLog(@"主线程----%@",[NSThread mainThread]);    //创建串行队列    dispatch_queue_t  queue= dispatch_queue_create("wendingding", NULL);    //2.添加任务到队列中执行    dispatch_sync(queue, ^{        NSLog(@"下载图片1----%@",[NSThread currentThread]);    });    dispatch_sync(queue, ^{        NSLog(@"下载图片2----%@",[NSThread currentThread]);    });    dispatch_sync(queue, ^{        NSLog(@"下载图片3----%@",[NSThread currentThread]);    });
0 0
原创粉丝点击