多线程之GCD

  • 什么是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]);
    });

}  //从打印结果就能看出来,由于是同步,并没有开启子线程,都是在主线程执行的,并发的效果也已经没了  

  暂结。。。。  

时间: 2024-10-07 05:26:29

多线程之GCD的相关文章

OC多线程之GCD ----- 2

dispatch_create生成的Queue不管是并行队列还是串行队列,其优先级都是默认优先级 但是可以用dispatch_set_target_queue来改变队列的优先级 dispatch_set_target_queue(原来的队列, 目标优先级队列) 使用这个函数需要获取两个队列,一个是需要变更优先级的队列,一个是指定优先级的队列(指定优先级的队列可以通过get_global获得) 如果多个串行队列优先级相同,那么这些队列里的任务也会串行执行 dispatch_after函数并不能非常

iOS多线程之GCD小记

iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言的,在在oc中使用时需要包含 #import<pthread.h> 使用这种多线程方案需要手动处理线程的各个状态的转换,也就是要管理线程的生命周期. 2.NSThread 这种多线程方案经过了苹果的封装,是一种面向对象的方案,因此可以直接操控线程对象,相对来说比较便捷,其生命周期也要手动管理 3.

OC多线程之GCD

要了解多线程首先要知道什么是进程,什么是进程? 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 什么是线程: 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行 线程的优缺点: 优势 (1)充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态 (2)将

iOS 开发之多线程之GCD

1.GCD(Grand Centrol Dispath) 并行:宏观以及微观都是两个人再拿着两把铁锹在挖坑,一小时挖两个大坑 并发:宏观上是感觉他们都在挖坑,微观是他们是在使用一把铁锹挖坑,一小时后他们挖了两个小坑. 总结:就单个cpu来说,大部分进程是并发进行的,就是一把铁锹,你一下我一下,只是间隔时间较短,用户感觉不到而已. 应用: GCD包括: (1)实际使用中 //dispatch_get_global_queue(0, 0)第一个0是优先级,第二个保留字段 dispatch_async

(五十五)iOS多线程之GCD

GCD的全称为Grand Central Dispatch,翻译为大中央调度,是Apple开发的一个多线程编程解决方法. 进程和线程的概念: 正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间. 线程是进程中一个独立的执行路径,即主线程,主线程有1M的栈区,对于耗时的执行路径,可以放在子线程(512K栈区)中执行. Tip:新建线程会消耗内存空间和CPU事件,线程太多会降低系统的运行性能,多线程是通过CPU时分复用实现的. Tip:多线程是为了并发执行多项任

iOS开发多线程之GCD

- (void)viewDidLoad { [super viewDidLoad]; /*GCD:Grand Central Dispatch 牛逼的中枢调度器,自动管理线程的生命周期(创建 调度 销毁).将任务存放到队列中,GCD会自动将队列中的任务取出,先进先出,放到线程中执行. 同步执行任务:在当前线程中执行 dispatch_sync(dispatch_queue_t queue,dispatch_block_t block) 异步执行任务:在其他线程执行 dispatch_async(

ios多线程之GCD

** dispatch_after 延时操作应用场景 例如:游戏后台需要做一些随机的事件,需要在某个时间后,调用方法! 1> 调用的方法通常是跟UI有关的,例如提示用户等 2> 不了解GCD或者多线程的人,可以直接填空即可 */ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self delay1]; } #pragma mark - 延时操作 /** 在其他线程中调用 dispatch_after */

iOS多线程之GCD学习笔记

什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 任务和队列 GCD中有2个核心概念 任务:执行什么操作 队列:用来存放任务 GCD的使用就2个步骤,首先确定定制任务(

iOS开发-多线程之GCD(Grand Central Dispatch)

Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过程中只需要将执行的任务并添加到到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.Dispatch Queue更简单而且在实现符合需求的多线程任务时更有效率.Dispatch  Queue一般来说有三种方式,如下图: Serial执行的时候的先进先出,Concurrent

IOS中的多线程之GCD

在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下CDD的使用. GCD(Grand Central Dispatch) ,他是基于C语言开发的一套多线程开发机制,也是目前苹果官方推荐的多线程开发方法.GCD的抽象层次最高,用起来比较简单,但是因为它是基于C语言开发的,是面向过程的,所以在使用的时候不如面向对象的好理解.但是GCD这种机制相比较于前面两种多线程开发方式最显著的优点就是它对于多核运算更加