经常使用;规避很多线程相关的复杂的逻辑
为什么会gcd?
因为pthread和nsthread要求开发人员对线程相关的知识了解深入; 手动启动线程;加锁/解锁;造成很多隐患 --》 苹果公司给出了gcd的多线程的解决方案(可选的设置)

什么是gcd?

GCD: Grand Central Dispatch: 一个多线程的解决方案
dispatch:迅速解决;
concurrent:同时发生的,并列的;serial:序列的,串行的
 
特性:
1) 基于c (宜用);
2)将原来的子线程做的任务放到队列queue(FIFO)中;以block方式执行
3) 自动的启动线程来执行队列中的任务(开发人员无需和线程直接打交道)
4) 线程数gcd会根据当前的资源自动的分配线程个数

队列类型:
串行队列:任务一个一个的按照顺序(FIFO)执行; 每次只能执行一个任务,并且必须等待前一个任务执行完毕
并行队列:同时执行多个任务;不必等待执行任务完成

执行任务方式:
同步执行:dispatch_sync队列中的任务在主线程中执行

异步执行:dispatch_async队列中的任务在子线程中执行
关键字:dispatch、queue、SERIAL、CONCURRENT
创建队列:
//1.创建一个空的串行队列(标题,队列类型[串行、并行])
DISPATCH_QUEUE_SERIAL = NULL
dispatch_queue_t queue = dispatch_queue_create("FirstSerialQueue", DISPATCH_QUEUE_SERIAL);
//1.创建一个空的并行队列
dispatch_queue_t queue = dispatch_queue_create("FirstConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
执行任务:
[NSThread currentThread]:获取当前的线程
[NSThread sleepForTimeInterval:1]:线程延时1秒
//同步执行
dispatch_sync(queue, ^{
    //线程执行的任务
    for (int i = 0; i < 10; i++) {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"--------------%@", [NSThread currentThread]);
    }
});
//异步执行
dispatch_async(queue, ^{
    //线程执行的任务
});
 
将队列和执行方式组合,就有四种方式:
-(void)coders{
    for (int i = 0; i < 2; i++) {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"--------------%@", [NSThread currentThread]);
    }
}
//———————————————------—不起作用哪-------------------------------------------
暂停一个队列
void dispatch_suspend ( dispatch_object_t object );
恢复一个队列
void dispatch_resume ( dispatch_object_t object );
释放一个队列
void dispatch_release ( dispatch_object_t object );
//----------------------------------------------------------------------------
//组合一:串行+同步:在主线程,按在顺序依次执行:
- (IBAction)serialSync:(id)sender {
    NSLog(@"串行队列;同步执行");
    //1.创建一个空的串行队列
    dispatch_queue_t queue = dispatch_queue_create("FirstSerialQueue", DISPATCH_QUEUE_SERIAL);
    //2.写第一个任务,并提交
    dispatch_sync(queue, ^{
        //线程执行的任务
        [self coders];
    });
    NSLog(@"打印第一个完毕");
    dispatch_sync(queue, ^{
        //线程执行的任务
        [self coders];
    });
    NSLog(@"打印第二个完毕");
}
//组合二:串行+异步:在子线程顺序执行(一个子线程)
- (IBAction)serialAsync:(id)sender {
    NSLog(@"串行队列;异步执行");
    dispatch_queue_t queue = dispatch_queue_create("SecondSerialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        [self coders];
    });
    NSLog(@"打印第一个完毕");
    dispatch_async(queue, ^{
        [self coders];
    });
    NSLog(@"打印第二个完毕");
}
//组合三:并行队列+同步执行=没有意义(相对于:串行+同步)
- (IBAction)concurrentSync:(id)sender {
    NSLog(@"并行队列;同步执行");
    dispatch_queue_t queue = dispatch_queue_create("FirstConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        [self coders];
    });
    NSLog(@"打印第一个完毕");
    dispatch_sync(queue, ^{
        [self coders];
    });
    NSLog(@"打印第二个完毕");
}
//组合四:并列+异步:在子线程,一个任务对应一个子线程,并列执行
- (IBAction)concurrentAsync:(id)sender {
    NSLog(@"并行队列;异步执行");
    dispatch_queue_t queue = dispatch_queue_create("SecondConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        [self coders];
    });
    NSLog(@"打印第一个完毕");
    dispatch_async(queue, ^{
        [self coders];
    });
    NSLog(@"打印第二个完毕");
}
//----------------------------------------------------------------------------
队列:
系统创建好两个的队列:
主队列(main queue) <—> 串行队列;顺序执行任务
全局队列(global queue) <—> 并行队列

排列组合:
全局队列 +异步执行 <==> 并行队列异步执行,在子线程并行中执行
主队列 +异步执行    <==> 串行队列异步执行,在主线程顺序中执行
主队列 + 同步执行     <==> 造成死锁
 
-(void)coders{
    for (int i = 0; i <2; i++) {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"-------%d-------%@", i,[NSThread currentThread]);
    }
}
- (IBAction)golbalSync:(id)sender {
    NSLog(@"全局队列 + 异步");
    //系统默认,直接获取就可以。dispatch_get_global_queue(优先级,)
    dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.写第一个任务,并提交
    dispatch_async(globalQueue, ^{
        //线程执行的任务
        [self coders];
    });
    NSLog(@"打印第一个完毕");
    //3.写第二个任务,并提交
    dispatch_async(globalQueue, ^{
        //线程执行的任务
        [self coders];
    });
    NSLog(@"打印第二个完毕");
}
主队列+同步:
- (IBAction)mainSynic:(id)sender {
    NSLog(@"主队列 + 同步");
    //获取主队列,会在主线程中执行队列中的任务
    dispatch_queue_t mainQueue=dispatch_get_main_queue();
    //2.写第一个任务,并提交
    dispatch_async(mainQueue, ^{
        [self coders];
    });
    NSLog(@"打印第一个完毕");
    //3.写第二个任务,并提交
    dispatch_async(mainQueue, ^{
        [self coders];
    });
    NSLog(@"打印第二个完毕");
}
主队列(和主线程绑定):顺序执行
先执行任务一:(mainSync);
然后再执行任务二:for循环
//---------------------------------End-------------------------------------------

多线程GCD的更多相关文章

  1. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  2. iOS多线程 GCD

    iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...

  3. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

  4. ios多线程-GCD基本用法

    ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...

  5. iOS 多线程GCD简介

    一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ...

  6. 多线程GCD的基本使用以及注意点

    GCD的使用  一:队列    1.串行队列:添加到队列中的任务是一个一个执行的    2.并行(发)队列:添加到队列中的任务是多个同时执行的(一个队列中的多个任务可以同时执行)    3.主队列:里 ...

  7. IOS开发之多线程 -- GCD的方方面面

    前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...

  8. 刀哥多线程GCD核心概念gcd

    GCD GCD 核心概念 将任务添加到队列,并且指定执行任务的函数 任务使用 block 封装 任务的 block 没有参数也没有返回值 执行任务的函数 异步 dispatch_async 不用等待当 ...

  9. ios开发多线程--GCD

    引言 虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能.当然,使用GCD完成一些简单的 ...

随机推荐

  1. Asp.Net 高性能框架 SqlSugar.ORM 2.3

    一.前言 SqlSugar从去年到现在已经一年了,版本从1.0升到了现在的2.3 ,这是一个稳定版本 ,有数家公司已经项目上线,在这里我将SqlSugar的功能重新整理成一篇新的贴子,希望大家喜欢. ...

  2. MySQL数据库的同步配置+MySql读写分离

    使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3. ...

  3. 咨询内容: TF卡一定要重新买吗,为什么我的放进去读不了呢

    京东回复:您好!先科(SAST) SA-992 便携数码音响 (兰色)不用重新买,但是需要您采用FAT分区重新格式化,感谢您对京东的支持!祝您购物愉快!

  4. eclipse 远程wifi调试android程序

    [原文]http://leanote.com/blog/view/541f8b2dbda4e44f75000000 下载wifidebug http://pan.baidu.com/s/1i3stnF ...

  5. 面向对象基础(class0425)字符串与集合

    常用类库 学习.net就是学习它的无数个类库怎么用,先看两个简单的 String 字符串,不可变特性.字符串可以看成字符数组 属性 Length 方法 IsNullOrEmpty() 静态方法 ToC ...

  6. HDU 4283 You Are the One (12年天津 区间DP)

    题意:有一个队列,每个人有一个愤怒值a[i],如果他是第k个上场,不开心指数就为(k-1)*a[i].但是边上有一个小黑屋(其实就是个堆栈),可以一定程度上调整上场程序 思路:枚举区间和每个人第几个上 ...

  7. 有关按位DP

    这是一道正式比赛的题目 数据范围是 10^999 ~ 10^1000 的两个整数以及一个k我记得好像是不超过100,计算两个数中间有多少个每一位相乘最后和k取摸等于0的数.这道题对于不会按位dp的人是 ...

  8. TCP/IP 相关总结

    1.   三次握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等 ...

  9. Android问题-selection contains a component,button7,introduced in an ancestor and cannot be deleted.

    问题现象: 在开发Android时增加的控件想删除,可是删除时提示“Android问题-selection contains a component,button7,introduced in an ...

  10. python 面向对象高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念.