zoukankan      html  css  js  c++  java
  • ios多线程--GCD

    (Grand Central Dispatch)多线程优化技术,GCD的使用离不开Dispatch

    1、什么是GCD

    是一套底层API,基于C语言开发的多线程机制,提供了新的模式编写并发执行的程序;

    2、GCD特点

    (1)允许将一个程序分为多个单一的任务,提到工作队列当中串行或者并发执行

    (2)配合了Block使用起来更加灵活

    (3)自动管理线程的生命周期(创建线程、调度任务、线程销毁)完全不用我们管理,只需要告诉它任务是什么就行

    (4)为多核的并行运算提出了解决方案,能够合理的利用CPU内核(比如双核、四核)

    3、什么是Queue队列

    GCD使用了队列的概念,解决了NSThread难于管理的问题,队列实际上就是数组的概念,通常是把要执行的任务放到队列里就ok了

    4、Queue特点

    (1)按顺序执行,先进先出

    (2)队列可以管理多线程、管理任务、设置主线程

    (3)GCD的队列是任务的队列、而不是线程的队列

    5、什么是任务

    任务即操作:你想要干什么、说白了就是一段代码、在GCD中就是一个Block

    任务的执行方式:

    (1)同步执行:只要是同步、都会在当前线程执行、不会另开线程

    (2)异步执行:只要是异步、都会开启新线程、在新开启的线程中执行

    6、什么是串行队列(排队)

    依次执行每一个任务

    7、什么是并行队列(一起跑、谁快谁先)

    好像所有任务都是在同一时间段执行的

    8、都有哪些队列

    主队列(MainQueue)、全局队列(Global Queue)、自定义的(Queue)

    GCD的任务队列 (三种)

    串行队列,同步任务,不需要新建子线程

    串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与

    并行队列,同步任务,不需要创建线程

    并行队列,异步任务,有多少个任务,就开N个线程执行(不可控制)

    dispatch 它是GCD技术常用变量和函数的前缀名

    1、自定义队列

    2、获取全局队列

    3、获取主队列

    (1)自定义队列

    0、创建队列

    参数一、给一个运行标记,可以为NULL

    参数二、属性,一般为NULL

    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);

    1、同步(只要是同步就不会开线程)

    dispatch_sync

    2、异步 

    dispatch_async

    任务在同一个队列里面都是串行的、只要是异步、肯定要开线程

    3、多队列

    dispatch_async

    每个线程的任务先执行一步、在依次(随机)执行第二步……

    4、组队列

    能够实现全部任务都执行完后再执行某事

    (1)将事件统一添加到组里

    dispatch_group_async(group, queue1, ^{

    (2)组内所有方法执行完毕,就会调用通知

    dispatch_group_notify(group, queue4, ^{

    (2)全局队列

    1、获取  dispatch_get_global_queue

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

    参数一:运行级别标识(高2,默认0,低-2,后台)

    参数二:,标记,一般给个0就可以

    2、特点:

            1.可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序执行的

            2.全局队列能够实现并行,只要是异步执行,就会开启线程(虽然都在全局队列里)

            3.我们不能自己创建,只能获取和调度

    (3)主队列

    1、获取主队列的方法

    dispatch_async(dispatch_get_main_queue(), ^{

    2、主队列常见错误(sync同步等待主队列、主队列等待sync返回、所以会卡死)

    NSLog(@"1");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"2");

        });

        NSLog(@"3");

  • 相关阅读:
    Angular 双向数据绑定
    Angular 过滤器
    Angular 自定义指令传参
    润滑油 标号
    Oracle concat
    sqlldr load UTF8 error
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    shell 执行结果赋给变量
    linux 如何显示一个文件的某几行(中间几行)
    linux shell date 用当天时间做备份文件名
  • 原文地址:https://www.cnblogs.com/gaduo/p/4996558.html
Copyright © 2011-2022 走看看