@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
// [self serialQueue];
// [self concurrentQueue];
[self gameStar];
}
#pragma mark ----------------创建串行队列两种方式--------------------
// 创建串行队列
- (void)serialQueue
{
// 串行队列分两种
//1、主线程的串行队列(主串队列)
// dispatch_queue_t GCD中表示一个队列
// 创建一个主队列 实际上就是把主线程取出来
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 添加任务1
// 参数一 要添加任务的队列
// 参数二 要执行的任务
dispatch_async(mainQueue, ^{
NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
// 添加任务2
dispatch_async(mainQueue, ^{
NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
// 添加任务3
dispatch_async(mainQueue, ^{
NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
// 2、自定义的串行队列
//创建一个自定义的线程队列
// 参数1 队列的标示符 (C语言字符串)
// 参数2 队列的执行类型(串/并)
//DISPATCH_QUEUE_SERIAL 串行
dispatch_queue_t myQueue = dispatch_queue_create("com.lxl", DISPATCH_QUEUE_SERIAL);
// 添加任务1
dispatch_async(myQueue, ^{
NSLog(@"--第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
// 添加任务2
dispatch_async(myQueue, ^{
NSLog(@"--第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
// 添加任务3
dispatch_async(myQueue, ^{
NSLog(@"--第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
//延迟回到主线程执行
//<#delayInSeconds#>填延迟几秒执行
// 延迟几秒后回到主线程执行任务
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"延迟5秒执行");
NSLog(@"延迟任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
// 延迟执行
// 参数2 <#dispatch_queue_t queue#> 自定义队列
// C语言中 ull 是字面量 表示unsigned long long
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6ull), myQueue, ^{
NSLog(@"延迟6秒执行");
NSLog(@"延迟任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
});
}
#pragma mark -------------------创建并行队列两种方式------------------------
// 创建并行队列
- (void)concurrentQueue
{
// 创建一个队列
// 参数1 队列的执行顺序 默认的
// 参数2 预留参数 一般填0
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 添加任务1
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
}
});
// 添加任务2
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
}
});
// 添加任务3
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
}
});
// 自定义并行队列
// 参数1 队列标识符
// 参数2 执行顺序(串/ 并) DISPATCH_QUEUE_CONCURRENT并行队列
dispatch_queue_t myQueue = dispatch_queue_create("com.www", DISPATCH_QUEUE_CONCURRENT);
// 添加任务1
dispatch_async(myQueue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
}
});
// 添加任务2
dispatch_async(myQueue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
}
});
// 添加任务3
dispatch_async(myQueue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
}
});
}
#pragma mark -------------模拟游戏开始的线程操作--添加屏障------------------------
// 模拟游戏开始的线程操作
- (void)gameStar
{
// 需求 一共四玩家一起进入游戏 当所有人都进入游戏的时候 开始读取数据
// 思路:
//1、选取什么队列 并行
//2、如何实现特殊要求 把并行队列用屏障隔开
//屏障的作用:把队列分成上下部 分开执行
// 创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("com.game", DISPATCH_QUEUE_CONCURRENT);
// 添加任务1
dispatch_async(queue, ^{
NSLog(@"玩家一进入游戏");
});
// 添加任务2
dispatch_async(queue, ^{
NSLog(@"玩家二进入游戏");
});
// 添加任务3
dispatch_async(queue, ^{
NSLog(@"玩家三进入游戏");
});
// 设置屏障
dispatch_barrier_async(queue, ^{
NSLog(@"等待其他玩家进入...");
});
// 添加读取信息任务
// 玩家一读取完成
dispatch_async(queue, ^{
NSLog(@"玩家一读取信息");
});
// 玩家二读取完成
dispatch_async(queue, ^{
NSLog(@"玩家二读取信息");
});
// 玩家三读取完成
dispatch_async(queue, ^{
NSLog(@"玩家三读取信息");
});
// 主线程进入游戏
// 再加一个屏障 进入主线程刷新界面
dispatch_barrier_async(queue, ^{
// 回到主线程 相当于给主线程添加一个任务
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"回到主线程 刷新界面 开始界面");
});
});
}
iOS经典讲解之多线程GCD的应用
最新推荐文章于 2021-12-16 15:00:00 发布