第01天多线程网络:(14):主队列的相关用法
2017-04-17 00:00
288 查看
#####一、主队列的相关用法
注意点:
#####二、
1.异步函数 + 主队列
2.同步函数 + 主队列 (产生死锁)
code
注意点:
同步函数 + 主队列 (产生死锁)
>>>一、并发队列 使用 dispatch_queue_create 函数创建队列 dispatch_queue_t dispatch_queue_create(队列名称, 队列的类型(并发、串行)) 创建并发队列 dispatch_queue_t queue = dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_CONCURRENT); >>> GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建 使用 dispatch_get_global_queue(队列的优先级, 此参数暂时无效,用0即可)函数获取全局的并发队列 获取全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 全局并发队列的优先级 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中) #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台 >>>二、串行队列 GCD 获取串行有2种途径 使用dispatch_queue_create函数创建串行队列 // 创建串行队列 (队列类型传递NULL或者DISPATCH_QUEUE_SERIAL) dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_SERIAL); 使用主队列(跟主线程相关联的队列) 主队列是GCD自带的一种特殊的串行队列 放到主队列的任务,都会放到主线程中执行 dispatch_get_main_queue() 获得主队列 >>>三、各个队列的执行效果
#####二、
异步函数 + 主队列和
同步函数 + 主队列 (产生死锁)
1.异步函数 + 主队列
#pragma mark 一、 异步函数 + 主队列 // 所有任务都会在主线程中执行,不会开现场, 任务是串行执行 - (void)asyncMain { // 1.获取主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); // 2.封装任务,将任务添加到队列里面 // 异步函数 dispatch_async(mainQueue, ^{ NSLog(@"download1 -- %@",[NSThread currentThread]); }); dispatch_async(mainQueue, ^{ NSLog(@"download2 -- %@",[NSThread currentThread]); }); dispatch_async(mainQueue, ^{ NSLog(@"download3 -- %@",[NSThread currentThread]); }); }
2.同步函数 + 主队列 (产生死锁)
#pragma mark 二、 同步函数 + 主队列 (产生死锁) /** 主队列的特点: 如果主队列发现当前主线程有任务在执行 那么主队列会暂停调用队列中的任务,知道主线程空闲位置 // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行 */ - (void)syncMain { // 1.获取主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); NSLog(@"start"); // 2.封装任务,将任务添加到队列里面 // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行 dispatch_sync(mainQueue, ^{ NSLog(@"download1 -- %@",[NSThread currentThread]); }); dispatch_sync(mainQueue, ^{ NSLog(@"download2 -- %@",[NSThread currentThread]); }); dispatch_sync(mainQueue, ^{ NSLog(@"download3 -- %@",[NSThread currentThread]); }); NSLog(@"end"); }
code
/**
>>>一、并发队列 使用 dispatch_queue_create 函数创建队列 dispatch_queue_t dispatch_queue_create(队列名称, 队列的类型(并发、串行)) 创建并发队列 dispatch_queue_t queue = dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_CONCURRENT); >>> GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建 使用 dispatch_get_global_queue(队列的优先级, 此参数暂时无效,用0即可)函数获取全局的并发队列 获取全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 全局并发队列的优先级 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中) #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台 >>>二、串行队列 GCD 获取串行有2种途径 使用dispatch_queue_create函数创建串行队列 // 创建串行队列 (队列类型传递NULL或者DISPATCH_QUEUE_SERIAL) dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_SERIAL); 使用主队列(跟主线程相关联的队列) 主队列是GCD自带的一种特殊的串行队列 放到主队列的任务,都会放到主线程中执行 dispatch_get_main_queue() 获得主队列 >>>三、各个队列的执行效果
*/
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// [self asyncMain];
// [self syncMain]; // 在主线程 调用 主队列 引起死锁
[NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil]; // 创建一个子线程(当前主线程处于空闲状态)
}
#pragma mark 一、 异步函数 + 主队列 // 所有任务都会在主线程中执行,不会开现场, 任务是串行执行 - (void)asyncMain { // 1.获取主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); // 2.封装任务,将任务添加到队列里面 // 异步函数 dispatch_async(mainQueue, ^{ NSLog(@"download1 -- %@",[NSThread currentThread]); }); dispatch_async(mainQueue, ^{ NSLog(@"download2 -- %@",[NSThread currentThread]); }); dispatch_async(mainQueue, ^{ NSLog(@"download3 -- %@",[NSThread currentThread]); }); }
#pragma mark 二、 同步函数 + 主队列 (产生死锁) /** 主队列的特点: 如果主队列发现当前主线程有任务在执行 那么主队列会暂停调用队列中的任务,知道主线程空闲位置 // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行 */ - (void)syncMain { // 1.获取主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); NSLog(@"start"); // 2.封装任务,将任务添加到队列里面 // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行 dispatch_sync(mainQueue, ^{ NSLog(@"download1 -- %@",[NSThread currentThread]); }); dispatch_sync(mainQueue, ^{ NSLog(@"download2 -- %@",[NSThread currentThread]); }); dispatch_sync(mainQueue, ^{ NSLog(@"download3 -- %@",[NSThread currentThread]); }); NSLog(@"end"); }@end
相关文章推荐
- 第01天多线程网络:(02):多线程相关概念
- sscanf,sscanf_s相关用法, 摘自网络
- 网络图片的异步加载器,多线程队列,带文件和内存缓存
- AJ学IOS(51)多线程网络之GCD下载合并图片_队列组的使用
- 第01天多线程网络:(09):线程安全
- 第01天多线程网络:(10):原子和非原子属性
- java 中基于udp协议的网络编程的 net库包的相关类的用法
- 第01天多线程网络:(05):pthread简单使用
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)
- Appium python client 网络连接相关 api 用法
- 第01天多线程网络:(07):NSThread创建线程的生命周期
- 使用GCD处理非UI相关的异步任务 Object-C异步多线程加载网络图片
- 猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)
- C#队列Queue多线程用法实例
- AJ学IOS(50)多线程网络之GCD简单介绍(任务,队列)
- 网络流量队列优先级相关知识点
- 网络设备发送队列相关数据结构及其创建函数 (linux网络子系统学习 第十节 )
- pthread_mutex_在多线程,多进程相关用法
- 苹果多线程网络编程之-GCD队列与任务的理解
- 第01天多线程网络:(06):NSThread的基本使用