16-多线程-01

16-多线程-01_第1张图片

一、GCD

16-多线程-01_第2张图片
16-多线程-01_第3张图片
16-多线程-01_第4张图片
16-多线程-01_第5张图片

串行队列产生的死锁:
只要使用sync函数往同一个串行队列中添加任务,就会产生死锁。只要改为async函数或改为并发队列就不会产生死锁。

  • sync:要求立刻执行队列里的任务。
  • 串行队列:队列里的任务取出一个执行完毕,再去下一个任务执行。
  • 并发队列:从队列里取出一个任务后不必等执行完毕,就可以去取下一个任务执行。
16-多线程-01_第6张图片
16-多线程-01_第7张图片
16-多线程-01_第8张图片

面试题:

  • 比较一下情况
    16-多线程-01_第9张图片
    代码1
16-多线程-01_第10张图片
代码2
16-多线程-01_第11张图片
代码3

源码分析:

  • 代码1:

    • performSelector: withObject: afterDelay:方法的本质是在RunLoop中添加定时器
    • 先打印1,3再打印2原因:处理完touchBegan事件后再处理定时器事件。
  • 代码2:

    • performSelector: withObject: 的本质是objcMsgSend
16-多线程-01_第12张图片
代码2源码
  • 代码3:
    • 不打印2,是因为在子线程中默认没有创建RunLoop。
16-多线程-01_第13张图片

二、GNUstep

16-多线程-01_第14张图片
16-多线程-01_第15张图片

面试题

16-多线程-01_第16张图片

16-多线程-01_第17张图片
16-多线程-01_第18张图片
16-多线程-01_第19张图片

二、GCD队列组

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // 创建队列组
    dispatch_group_t group = dispatch_group_create();
    // 创建并发队列
    dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT);
    
    // 添加异步任务
    dispatch_group_async(group, queue, ^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"任务1-%@", [NSThread currentThread]);
        }
    });
    
    dispatch_group_async(group, queue, ^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"任务2-%@", [NSThread currentThread]);
        }
    });
    
    // 等前面的任务执行完毕后,会自动执行这个任务
//    dispatch_group_notify(group, queue, ^{
//        dispatch_async(dispatch_get_main_queue(), ^{
//            for (int i = 0; i < 5; i++) {
//                NSLog(@"任务3-%@", [NSThread currentThread]);
//            }
//        });
//    });
    
    //如果是主队列就在主队列中执行
//    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//        for (int i = 0; i < 5; i++) {
//            NSLog(@"任务3-%@", [NSThread currentThread]);
//        }
//    });
    
    //如果是并发队列,就在子线程中并发执行
    dispatch_group_notify(group, queue, ^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"任务3-%@", [NSThread currentThread]);
        }
    });
    
    dispatch_group_notify(group, queue, ^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"任务4-%@", [NSThread currentThread]);
        }
    });
    
}

@end
16-多线程-01_第20张图片

三、多线程的安全隐患

16-多线程-01_第21张图片

你可能感兴趣的:(16-多线程-01)