码迷,mamicode.com
首页 > 编程语言 > 详细

多线程之GCD

时间:2016-03-13 17:44:27      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

  • 什么是GCD

  Grand Central Dispatch 是Apple开发的一种多核编程技术。主要用于优化应用程序以支持多核处理器以及其他多对称处理系统TA会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,我们只需要告诉干什么就行。同时它使用的也是 c语言,不过由于使用了 Block(Swift里叫做闭包),使得使用起来更加方便,而且灵活。所以基本上大家都使用 GCD 这套方案

  • 什么是任务和队列

  在GCD中有两个非常重要的概念,就是任务和队列

  任务:任务就是一段功能代码,在GCD中一般就是一段block或者函数(block用的比较多),任务有两种执行方式,同步和异步。

  同步和异步的区别就在于是否会阻塞当前线程:

  如果是 同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。

  如果是 异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程。

  同步函数无法开启子线程而异步函数有开启子线程的功能。

 

  队列:用于存放任务,队列一般分为两种,串行队列(SerialQueue)和并行队列(Concurrent),都遵守FIFO。

  队列中的任务根据同步和异步的不同有不同的执行方式:

  技术分享

  同步并行,因为同步没有开启子线程的功能,所以并行队列也就失去了并行的效果,一般使用最多的方式就是异步并行。

  

  主队列:这是一个比较特殊的队列,主队列是主线程中的队列,所以不管是异步函数还是同步函数,都不会生成新的分支线程,也就是说异步函数在主队列中丧失了开启线程的能力。TA用于刷新 UI,任何需要刷新 UI 的工作都要在主队列执行,所以一般耗时的任务都要放到别的线程执行。

  

  •  GCD的使用

  1、异步并发

//1、异步并发(最常用) 开启多条子线程,任务是并发执行的
- (void)asynGlobal {
    //获取全局的并发队列
    //第一个参数代表队列优先级,如果优先级高,那么这个队列调度的次数就会多一点。通常情况下,这个优先级给默认的优先级
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //一般情况下并行队列使用这个全局的并发队列就行了,不想使用全局队列也可以创建,因为是c函数,所以第一个参数的字符串不要顺手就在前面加个@符号
//    dispatch_queue_t queue = dispatch_queue_create("6666", DISPATCH_QUEUE_CONCURRENT);
    //将任务添加到并发队列中异步执行
    dispatch_async(queue, ^{
        NSLog(@"%@-----你484傻-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@------你没吃药吧----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----能不能去吃药-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----滚去吃药-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----扑街-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----再次扑街-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    
    //如果是MRC的环境,队列使用完毕之后,需要释放队列
//    dispatch_release(queue);
}

  //执行效果 如果加入队列的任务太多,为了不消耗过多性能,系统会控制开启的子线程的条数,等有任务执行完了再让剩下的任务继续并行,所以才会有第一条和最后一条是同一个线程的结果。由于是异步函数开启了子线程不是在主线程中,所以[NSThread isMainThread]的值为0
  技术分享

 

   2、异步串行

//异步串行(有时会用) 开启一条子线程,任务在开启的线程中挨个执行
- (void)asynSerial {
    //创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("bada.queue", DISPATCH_QUEUE_SERIAL);
    
    //将任务添加到串行队列中异步执行
    dispatch_async(queue, ^{
        NSLog(@"%@-----你484傻-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@------你没吃药吧----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----能不能去吃药-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----滚去吃药-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%@-----扑街-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    
}
  //从结果就能看出来是在同一条子线程执行的
  技术分享

  

  3、同步并发 

   

//同步 并发(基本不使用) 如果是同步,在不开启子线程的情况下,并发的效果已经消失了
- (void)synGlobal {
    
    //获取全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //将任务添加到并发队列中同步执行
    dispatch_sync(queue, ^{
        NSLog(@"%@-----你484傻-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"%@-----你没吃药吧-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"%@-----能不能吃药-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"%@-----滚去吃药-----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"%@-----扑街----%d",[NSThread currentThread], [NSThread isMainThread]);
    });
    
}
  //从打印结果就能看出来,由于是同步,并没有开启子线程,都是在主线程执行的,并发的效果也已经没了
  技术分享

 

  暂结。。。。  

多线程之GCD

标签:

原文地址:http://www.cnblogs.com/dabaomo/p/5272155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!