OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// GCD 开几条线程并不是我们可以控制的,而是系统来决定的,
// [self asyncConcurrent];
// [self asyncSerial];
// [self syncConcurrent];
// [self syncSerial];
// [self test_get_global_queue];
// [self syncMain];//主线程操作直接死锁
[NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil];//在子线程地调用,会直接执行,不会死锁
} /**
异步函数 + 并发队列 :会开启多条线程,队列中的任务是异步执行的(并发执行)(无序执行的)
*/
- (void)asyncConcurrent{ //1.创建任务
/*
参数1:const char * _Nullable label , C语言参数 字符串 ,标识符,为了区分队列的 推荐写法:反着写
参数2:dispatch_queue_attr_t _Nullable attr,队列类型
DISPATCH_QUEUE_CONCURRENT 并发,
DISPATCH_QUEUE_SERIAL 串行
*/
dispatch_queue_t queue = dispatch_queue_create("com.520it.www", DISPATCH_QUEUE_CONCURRENT); //2 2.1封装任务 2.2添加到任务队列中
/**
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
参数1:dispatch_queue_t _Nonnull queue 队列
参数2:<#^(void)block#> 要执行的任务
*/
dispatch_async(queue, ^{
NSLog(@"打印一下111 --- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"打印一下222 --- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"打印一下333 --- %@", [NSThread currentThread]);
});
} /**
异步函数 + 串行队列:可以开启线程,但是串行队列只会在同一个子线程执行
*/
- (void)asyncSerial{
dispatch_queue_t queue = dispatch_queue_create("asyncSerial", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"打印一下111 --- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"打印一下222 --- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"打印一下333 --- %@", [NSThread currentThread]);
});
} /**
同步函数 + 并发队列 :不会会开启多条线程,不管后面是并发还是串行,任务是串行执行的
*/
- (void)syncConcurrent{ //1.创建任务 dispatch_queue_t queue = dispatch_queue_create("com.520it.www", DISPATCH_QUEUE_CONCURRENT); dispatch_sync(queue, ^{
NSLog(@"打印一下111 --- %@", [NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"打印一下222 --- %@", [NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"打印一下333 --- %@", [NSThread currentThread]);
});
} /**
同步函数 + 串行队列 :不会会开启多条线程,不管后面是并发还是串行,任务是串行执行的
*/
- (void)syncSerial{
dispatch_queue_t queue = dispatch_queue_create("syncSerial", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"打印一下111 --- %@", [NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"打印一下222 --- %@", [NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"打印一下333 --- %@", [NSThread currentThread]);
});
} /**
获得全局队列
*/
-(void)test_get_global_queue{ /**
获得全局并发队列 : 这个队列已经存在的, 我们只是获得
参数1 : long identifier 优先级,
DISPATCH_QUEUE_PRIORITY_HIGH 2
DISPATCH_QUEUE_PRIORITY_DEFAULT 0
DISPATCH_QUEUE_PRIORITY_LOW (-2)
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 这是最低的优先级 参数2 : unsigned long flags 给未来使用, 总是给个0
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"打印一下111 --- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"打印一下222 --- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"打印一下333 --- %@", [NSThread currentThread]);
});
}
1.
2

3.
4.
5.
8. 
OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列的更多相关文章
- OC 线程操作 - GCD使用 - 栅栏函数
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //同步函数无需栅栏函数 //栅栏 ...
- OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self downImag ...
- OC 线程操作 - GCD队列组
1.队列组两种使用方法2.队列组等待 wait /** 新方法 队列组一般用在在异步操作,在主线程写队列组毫无任何作用 */ - (void)GCD_Group_new_group___notify{ ...
- OC 线程操作 - GCD快速迭代
- (void)forDemo{ //全都是在主线程操作的 ; i<; i++) { NSLog(@"--%@", [NSThread currentThread]); } ...
- iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一 ...
- ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...
- OC线程操作-GCD介绍
1. GCD介绍 1.11.2 1.3 异步具备开启能力但是不是 一定可以开启 1.4 1.5 67. 8.
- GCD死锁,及同步、异步、串行和并行队列组合情形
一.概述 1)队列用来存储代码任务,线程用来运行代码任务: 2)main()函数作为程序入口,整个程序默认运行在主线程中,程序代码任务默认存放在主队列中: 3)以下所谓阻塞线程是针对主线程而言(子 ...
- iOS:对GCD中 同步、异步、并行、串行的见解
1.GCD-同步执行多线程时 GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程). 2.GCD-异步执行多线程时 GCD中不管向什么类 ...
随机推荐
- python中将HTTP头部中的GMT时间转换成datetime时间格式
原文: https://blog.csdn.net/zoulonglong/article/details/80585716 需求背景:目前在做接口的自动化测试平台,由于接口用例执行后返回的结果中的时 ...
- 经典收藏链接(C#总结)
去年底转到Java,在此总结一下.很多不错的C#博客在此收藏标记\(^o^)/~ 1.基础知识 Linq专题:http://www.cnblogs.com/RuiLei/archive/2009/09 ...
- 哈希与位图(Hash and BitMap)
Hash:哈希机制 BitMap:位图机制 目的:都是为了保证检索方便而设置的数据结构 对于大数据进行排序,由于内存限制,不可能在内存中进行,所以采取BitMap机制 为了在大数据中快速检索以及操作数 ...
- Django中间件执行流程
中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程 1. 获取浏览器端的IP地址: 使用 request.META[‘REMOTE_ADDR’] 2. 使用中间件 ...
- Linux--多网卡的7种Bond模式和交换机配置
网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是一种常用的技术,我们公司基本所有的项目相关服务器都做了bond,这里总结整理,以便待查. bond ...
- Helm 入门安装指南
Helm 是 Kubernetes 生态系统中的一个软件包管理工具.本文将介绍 Helm 中的相关概念和基本工作原理,并通过一个具体的示例学习如何使用 Helm 打包.分发.安装.升级及回退 Kube ...
- python的分支循环
知识内容: 1.if-else分支结构 2.while循环 3.for循环 4.循环结构综述 5.break和continue语句 一.if-else分支结构 1.单分支选择结构 if 表达式: 语句 ...
- c++官方文档
来自官方文档...感谢老王指出需要c++11,一下代码全在c++11下编译,编译参数加入 -std=c++11 #include<stdio.h> #include<iostrea ...
- load data
LOAD DATA INFILE 'D:\GX\\mm.txt' REPLACE INTO TABLE mm FIELDS TERMINATED BY ' ' // 以空格为分隔符插入数据,前提是mm ...
- 65. sqlserver执行存储过程实例
declare @param varchar(500)exec sp_PUB_GetFlowStatus @ret output,10011,88,1,12print @ret