iOS_多线程_基本概念

2020-10-13  本文已影响0人  MR_詹

iOS多线程方案


image.png

同步、异步、并发、串行
同步:在当前线程中执行任务,不具备开启新线程的能力。
注意:需要立马在当前线程执行任务,执行完毕后才能继续往下执行

异步:在新的线程中执行任务,具备开启新线程的能力(但不一定都会开启新线程,比如在主队列中,因为主队列中的每个任务都必须是在主线程中执行的)
注意:不要求立马执行

并发和串行主要影响:任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,在执行下一个任务

 /// 创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_SERIAL);
/// 创建一个并发队列
dispatch_queue_t asyncQueue = dispatch_queue_create("async_queue", DISPATCH_QUEUE_CONCURRENT);
/// 获取全局队列(也是一个并发队列)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
/// 获获取主队列(主队列也是一个特殊的串行队列,因为主队列的任务是不会开启新的子线程执行的,都必须在主队列中执行)
dispatch_queue_t mainQueue = dispatch_get_main_queue();


/// 同步任务
/// 任务1
dispatch_async(asyncQueue, ^{
 for (int i=0; i<5; i++) {
  NSLog(@"执行任务1 %d:%@",i,[NSThread currentThread]);
   }
});
    
/// 同步任务
/// 任务2
dispatch_async(asyncQueue, ^{
  for (int i=0; i<5; i++) {
    NSLog(@"执行任务2 %d:%@",i,[NSThread currentThread]);
   }
 }); 

[图片上传失败...(image-9705ca-1602519329137)]

# 以下代码会产生死锁

#提醒:线程的任务是指代码块,都是以中括号{}为准,比如此处主队列总共有两个任务:
任务1:viewDidLoad{}
任务2:dispatch_sync{}

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"打印1");
    
    /// 队列的特点:排队,FIFO,First In First Out 先进先出
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"打印2");
    });
    /// dispatch_sync : 立马在当前线程执行任务,执行完毕后才能继续往下执行

    NSLog(@"打印3");
}

@end
# 也是会产生死锁:因为在子串行队列中,添加了同步任务
打印结果是:1 5 2 崩溃

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"打印1");
    
    dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"打印2");
        dispatch_sync(queue, ^{
            NSLog(@"打印3");
        });
        NSLog(@"打印4");
    });
    
    NSLog(@"打印5");
}

@end
# 换成这种写法不会产生死锁,因为my_queue是并发队列,那么也就是说队列里的任务是可以同时执行的,
# 不需要等待一个任务执行完成后才去执行另外一个任务

打印结果:1 5 2 3 4

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"打印1 %@",[NSThread currentThread]);
    
    dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{    /// my_queue队列:任务1
        NSLog(@"打印2 %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{     /// my_queue队列:任务2
            NSLog(@"打印3 %@",[NSThread currentThread]);
        });
        NSLog(@"打印4 %@",[NSThread currentThread]);
    });
    
    NSLog(@"打印5 %@",[NSThread currentThread]);
}

@end
上一篇 下一篇

猜你喜欢

热点阅读