您的位置:首页 > 理论基础 > 计算机网络

第01天多线程网络:(14):主队列的相关用法

2017-04-17 00:00 288 查看
#####一、主队列的相关用法
注意点:
同步函数 + 主队列 (产生死锁)


>>>一、并发队列
使用 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息