主队列又叫全局串行队列,本质上就是串行队列
主队列特点:
1.如果主线程正在执行代码暂时不调度任务,主线程空闲时,才会执行主队列上的任务
2.主队列上的任务在主线程执行主队列,异步任务
不开线程,同步执行
- 主队列,同步执行(重点)
程序执行不出来(死锁)
死锁的原因,当程序执行到这段代码的时候
1.主队列特点:如果主线程正在执行代码,就不调度任务(只有主线程空闲才会执行主队列中的任务)
2.因为是同步执行任务,如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务
这样就导致了主队列和主线程间相互等待,程序无法往下执行(死锁)
- 示例代码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
// 主队列与同步/异步
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 异步执行
// [self mainQueueAsync];
// 同步执行
// [self mainQueueSync]; --> 死锁
[self mainQueueSyncTask]; // -> 主队列同步执行任务(解决死锁)
}
// 主队列异步
- (void)mainQueueAsync{
// 1.获取队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 2.创建任务
dispatch_block_t task1Block = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t task2Block = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 3.异步执行任务
dispatch_async(mainQueue, task1Block);
dispatch_async(mainQueue, task2Block);
// 结论: 同步执行,不开启新线程 (注意点:主队列的任务一定是在主线程执行,而自行创建的串行队列是在当前线程来执行)
}
// 主队列同步 (解决死锁)
- (void)mainQueueSyncTask{
NSLog(@"Begin");
// 将主队列同步任务放入一条子线程中异步执行,因为主队列任务会在主线程执行,所以并不影响主队列中的任务在主线程执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 1.获取队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 2.创建任务
dispatch_block_t task1Block = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t task2Block = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 3.异步执行任务
dispatch_sync(mainQueue, task1Block); // 程序会一致卡在这句代码-->主队列同步执行导致死锁
dispatch_sync(mainQueue, task2Block);
});
NSLog(@"End");
// 结果: 死锁
}
// 主队列同步 (死锁)
- (void)mainQueueSync{
NSLog(@"Begin");
// 1.获取队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 2.创建任务
dispatch_block_t task1Block = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t task2Block = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 3.异步执行任务
dispatch_sync(mainQueue, task1Block); // 程序会一致卡在这句代码-->主队列同步执行导致死锁
dispatch_sync(mainQueue, task2Block);
NSLog(@"End");
// 结果: 死锁
}
@end