多线程 GCD 的使用
参考:http://www.jianshu.com/p/2d57c72016c6
GCD 的两个核心概念: 队列 与 任务
一.队列
队列分为串行队列和并发队列, 队列的作用是管理开发者提交的任务,在队列的底层维护了一个线程池,用于执行任务
串行队列底层的线程池, 只维护一个线程
并发队列底层的线程池, 可以维护多个线程
二.任务
任务分为 同步任务 和 异步任务,主要区别是 是否具备开启新线程的能力
综上,只有将 异步任务 添加到 并发队列中,才可以达到并发执行任务的目的(队列满足: 能够维护多个线程 任务满足: 具备开启新线程的能力),其他组合不能满足这两个条件
三. GCD 的函数 使用
//基本创建
- (void)baseCreate{
//队列的创建
//串行队列(主队列)
dispatch_queue_t queueSer = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
//并发队列(全局队列)
dispatch_queue_t queueCon = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
//任务的创建
//同步任务+串行
dispatch_sync( queueSer, ^{
NSLog(@"%@",[NSThread currentThread]);
});
//异步任务+并发
dispatch_async(queueCon, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
#pragma mark 同步任务+并发队列
- (void)syncConcurrent
{
NSLog(@"syncConcurrent---begin");
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"1------%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"2------%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"3------%@",[NSThread currentThread]);
}
});
NSLog(@"syncConcurrent---end");
}
#pragma mark 异步任务+并发队列
- (void)asyncConcurrent
{
NSLog(@"asyncConcurrent---begin");
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"1------%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"2------%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"3------%@",[NSThread currentThread]);
}
});
NSLog(@"asyncConcurrent---end");
}
//栅栏
- (void)barrier
{
dispatch_queue_t queue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
//栅栏的作用: 必须前面的任务执行完成之后,才会执行后面的任务
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4-----%@", [NSThread currentThread]);
});
}
//延迟执行
- (void)after{
//after 延迟执行,并不会阻塞主队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"1 after--%@",[NSDate date] );
});
}
//多次执行该段代码
- (void)apply{
//同一时间--执行该段代码 n 次
dispatch_apply(500, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
NSLog(@"apply%@",[NSDate date]);
});
}
//队列组
//将对个任务添加到队列组中, 需要多个任务都执行完成后,在做其他操作(回到主线程刷新 UI)
- (void)group{
//1.将任务添加到队列组中
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
//2.调用队列组的通知方法,监听任务都执行完毕-->其他线程
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"main--刷新 UI");
});
}
关于多线程死锁问题:(造成任务一直等待,不能向下执行)
参考:http://www.cnblogs.com/Twisted-Fate/p/4864278.html
多线程 GCD 的使用的更多相关文章
- iOS 多线程GCD的基本使用
<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...
- iOS多线程 GCD
iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- ios多线程-GCD基本用法
ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...
- iOS 多线程GCD简介
一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ...
- 多线程GCD的基本使用以及注意点
GCD的使用 一:队列 1.串行队列:添加到队列中的任务是一个一个执行的 2.并行(发)队列:添加到队列中的任务是多个同时执行的(一个队列中的多个任务可以同时执行) 3.主队列:里 ...
- IOS开发之多线程 -- GCD的方方面面
前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...
- 刀哥多线程GCD核心概念gcd
GCD GCD 核心概念 将任务添加到队列,并且指定执行任务的函数 任务使用 block 封装 任务的 block 没有参数也没有返回值 执行任务的函数 异步 dispatch_async 不用等待当 ...
- ios开发多线程--GCD
引言 虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能.当然,使用GCD完成一些简单的 ...
- 多线程GCD
经常使用:规避很多线程相关的复杂的逻辑 为什么会gcd?因为pthread和nsthread要求开发人员对线程相关的知识了解深入; 手动启动线程:加锁/解锁;造成很多隐患 --> 苹果公司给出了 ...
随机推荐
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial
Lecture 5 Octave教程 5.1 基本操作 Basic Operations 5.2 移动数据 Moving Data Around 5.3 计算数据 Computing on Data ...
- UDP数据报
服务器端:Server 函数: 1.inet_addr()://把IP地址转换为长整型2.inet_ntoa();//将长整型转换为IP地址3.socket的阻塞和非阻塞: 阻塞模式下: 在程序中,“ ...
- 【bzoj1455】罗马游戏
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1061 Solved: 439[Submit][Status][Discuss] ...
- 带你剖析WebGis的世界奥秘----瓦片式加载地图(转)
带你剖析WebGis的世界奥秘----瓦片式加载地图 转:https://zxhtom.oschina.io/zxh/20160805.html 编程 java 2016/08/05 0留言, ...
- 小程序为什么脚本内不能使用window等对象
小程序(应用号)内不能使用window等对象. 页面的脚本逻辑在是在JsCore中运行,JsCore是一个没有窗口对象的环境,所以不能再脚本中使用window,也无法在脚本中操作组件.
- 680. Valid Palindrome II 对称字符串-可删字母版本
[抄题]: Given a non-empty string s, you may delete at most one character. Judge whether you can make i ...
- mybatis 框架 的应用之三(操作两张没有关联的表,存在主键和外键关系)
#注意:要配置开启多条语句操作,否则会报错( org.apache.ibatis.exceptions.PersistenceException) lf-driver=com.mysql.jdbc.D ...
- Luogu 5043 【模板】树同构([BJOI2015]树的同构)
BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...
- Join导致冗余数据引起慢SQL
业务过程中碰到多个join引起慢SQL问题,数据量不大,但查询很慢,搜到一片BLog,参考解决. 业务过程不记录,以blog内容重现: 原SQL: select distinct abc.pro_co ...
- 编写高质量代码改善C#程序的157个建议——建议18:foreach不能代替for
建议18:foreach不能代替for 上一个建议中提到了foreach的两个优点:语法更简单,默认调用Dispose方法,所有我们强烈建议在实际的代码编写中更多的使用foreach.但是,该建议也有 ...