ios多线程 GCD使用

我们程序员可以以便敲代码一边看显示器,但是在程序中代码是顺序执行,也就是说一步步执行,只有等上一个任务执行完毕才会执行下一个任务。在中间等待的这段时间被白白浪费掉,并且不能合理利用系统资源,这时候我们就希望代码能够像我们一样一心二用,同时执行两个或两个以上的任务,这时候就需要用到多线程。

在 ios中有三种多线程技术,分别是 :

   1.NSThread

     (1)使用NSThread管理多个线程比较麻烦,需要手动开启和关闭

     (2)使用[NSThread currentThread] 可以跟踪任务所在线程,适用于这三种技术

   2.NSOperation/NSOperationQueue

     提供了一些在GCD中不容易实现的特性,可以设置最大并发数量、操作之间的依赖关系

   3.GCD —— Grand Central Dispatch

     (1)是基于C语言的底层API

     (2)用Block定义任务

     (3)提供了更多的控制能力以及操作队列中所不能使用的底层函数


在介绍GCD多线程之前需要明白几个概念 :

进程 :系统正在运行的应用程序,有自己独立的内存空间

线程 :线程是进程中一个独立的执行路径,一个进程中至少包含一个主线程,即主线程


  串行队列:队列中的任务只会依次顺序往下执行,排队执行,先进来的先执行,执行完毕再接着执行下一个

dispatch_queue_t q = dispatch_queue_create(“....”, DISPATCH_QUEUE_SERIAL);

  并行队列:队列中的任务会并发执行,类似于田径赛跑,没有特定的执行顺序,不能确定哪个任务先执行完

dispatch_queue_t q = dispatch_queue_create("......", DISPATCH_QUEUE_CONCURRENT);

               全局队列:是系统自带的队列,直接获取使用,可以设置执行的优先级,一共四个优先级可以设定

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

主队列:每个应用程序都有的唯一主队列,直接获取使用,在多线程里面,使用主队列更新UI


队列和线程的区别:队列管理线程,相当于线程池,管理线程什么时候执行。



操作:

同步操作:dispatch_sync 把任务交给队列后就原地等待队列把任务执行完毕在往下执行


异步操作:dispatch_async 把任务交给队列后立马返回,继续执行下面的代码(不用管队列是否把任务执行完毕)

在主队列或串行队列中使用同步操作导致锁死

   dispatch_sync(mianQueue, ^{

                        NSLog(@"hellow world !");

});

// hellow 永远不会被执行(打印)

在主队列开启同步任务,因为主队列是串行队列,里面的线程是有顺序的,先执行完一个线程才执行下一个 线程,而主队列始终就只有一个主线程,主线程是不会执行完毕的,因为他是无限循环的,除非关闭应用程序。 因此在主线程开启一个同步任务,同步任务会想抢占执行的资源,而主线程任务一直在执行某些操作,不肯放手 。最终导致死锁,阻塞线程。


#pragma mark---------------主队列异步操作利用系统空闲时间执行任务----------------------

   /* dispatch_async(mianQueue, ^{

        NSLog(@"dfgfdgsd");

    });

    NSLog(@"8888");

    */


#pragma mark ------------------主队列(主队列是串行队列)只能异步添加任务,否则锁死----------------------------------

/*

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

        dispatch_async(mainQueue, ^{

            NSLog(@"11111");

        });

        dispatch_async(mainQueue, ^{

            NSLog(@"22222");

        });

        dispatch_async(mainQueue, ^{

            NSLog(@"33333");

        });

    

 */


#pragma mark----------------创建(开辟)新的串(并)行队列同步添加任务------------------------------------------

                    //创建队列的两个参数  DISPATCH_QUEUE_SERIAL 设置队列为同步

                    //                                      DISPATCH_QUEUE_CONCURRENT  设置队列为异步

 

    /*

    dispatch_queue_t huLuWaQueue = dispatch_queue_create("huluwa", DISPATCH_QUEUE_CONCURRENT);

                                    

        dispatch_sync(huLuWaQueue, ^{

            NSLog(@"11111");

        });

        dispatch_sync(huLuWaQueue, ^{

            NSLog(@"22222");

        });

        dispatch_sync(huLuWaQueue, ^{

            NSLog(@"55555");

        });

   */

   

#pragma mark--------------------------使用全局并发队列-----------------------------------------------------------

    // 参数  long identifier :设置优先级 

    // 参数  unsigned long flags  默认写 0

 /*        dispatch_queue_t firstQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

            dispatch_queue_t secondQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

            dispatch_queue_t thirdQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

            dispatch_async(firstQueue, ^{

                        NSLog(@"111111");

                    });

            dispatch_async(secondQueue, ^{

                        NSLog(@"22222");

                    });

            dispatch_async(thirdQueue, ^{

                        NSLog(@"33333");

                    });

    */


#pragma mark---------------------GCD分组------------------------------------------

    

    //dispatch_group_create()    创建一个分组  dispatch_group_t 相当于一个类名,但它不是类名

    

    dispatch_group_t num1 = dispatch_group_create();  //组名

//    dispatch_queue_t queue1 = dispatch_queue_create("num1", NULL);//线程名

    dispatch_queue_t queue1 = dispatch_queue_create("dddd", DISPATCH_QUEUE_CONCURRENT);

    //参数 :组名  队列名  任务

    dispatch_group_async(num1, queue1, ^{

        NSLog(@"555555");

    });

    

    dispatch_group_async(num1, queue1, ^{

        NSLog(@"666666");

    });

//分组任务执行完毕的通知  参数 :组名  队列名 执行完后要执行的任务

    dispatch_group_notify(num1, queue1, ^{

        NSLog(@"完毕1");

    });


  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值