多线程GCD--”牛逼的中枢调度器(二)“

核心概念:将任务添加到队列,指定任务执行方法
任务
*使用block 封装
*block 就是一个提前准备好的代码块,在需要的时候执行
队列
*串行:一个接一个的调度任务
*并发:可以同时调度多个任务
任务执行函数 (都需要在线程中操作)
*同步执行:当前指令不完成,不会执行下个指令(不会到线程池中拿子线程)
*异步执行:当前指令不完成,不会等待 继续执行下个指令(只要有任务,就会到线程池中取子线程;主队列除外!)

开不开线程,取决于执行任务的函数,同步不开异步开
开几条线程,取决于队列,串行一条 并发多条(异步)

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    [self gcdDemo1];
//    [self gcdDemo2];
//    [self gcdDemo3];
//    [self gcdDemo4];
    [self gcdDemo6];
}
//串行队列:同步任务
//不会开启线程 顺序执行
-(void)gcdDemo1{
    /**
    1.队列 名称
    2.队列的属性 DISPATCH_QUEUE_SERIAL 标识串行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", NULL);

    //同步执行任务
    for (int i=0; i<10; i++) {
        dispatch_sync(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }

}
//串行队列 异步任务
- (void)gcdDemo2{
    /**
    1.队列 名称
    2.队列的属性 DISPATCH_QUEUE_SERIAL 标识串行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", NULL);

    //异步执行任务
    for (int i=0; i<10; i++) {
        NSLog(@"%d---------",i);
        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //主线程任务
    NSLog(@"over");
}
//并发队列 异步执行
- (void)gcdDemo3{
    /**
    1.队列 名称
    2.队列的属性 DISPATCH_QUEUE_CONCURRENT 标识并行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", DISPATCH_QUEUE_CONCURRENT);

    //异步执行任务
    for (int i=0; i<10; i++) {
//        NSLog(@"%d---------",i);

        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //主线程任务
    NSLog(@"over");
}

//并发队列 同步执行
//不会开启线程 循序执行
- (void)gcdDemo4{
    /**
    1.队列 名称
    2.队列的属性 DISPATCH_QUEUE_CONCURRENT 标识并行
    */
    dispatch_queue_t q =dispatch_queue_create(@"lsgcd", DISPATCH_QUEUE_CONCURRENT);

    //异步执行任务
    for (int i=0; i<10; i++) {
//        NSLog(@"%d---------",i);

    dispatch_sync(q, ^{
        NSLog(@"%@ %d",[NSThread currentThread],i);
    });
}
//主线程任务
NSLog(@"over");
}

#pragma mark 同步任务
//作用:在开发中 通常将耗时操作 放在后台执行,有些任务彼此有’依赖‘关系
//例子:登录 支付 下载
- (void)gcdDemo5{
    dispatch_queue_t loginQueue =dispatch_queue_create(@"lsGCD", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(loginQueue, ^{
        NSLog(@"用户登录 %@",[NSThread currentThread]);
    });

    dispatch_async(loginQueue, ^{
        NSLog(@"用户支付 %@",[NSThread currentThread]);
    });

    dispatch_async(loginQueue, ^{
     NSLog(@"用户下载 %@",[NSThread currentThread]);
    });
}
//增强版同步任务
//可以让队列调度多个任务前 指定一个同步任务 让所有的异步w任务,等待同步任务执行完成,这就是依赖关系
//同步任务会造成一个死锁
- (void)gcdDemo6{
    //队列
    dispatch_queue_t loginQueue = dispatch_queue_create(@"lsGCD", DISPATCH_QUEUE_CONCURRENT);
    void(^task)() = ^{
        for (int i=0 ; i <10; i++) {
            NSLog(@"%d %@",i,[NSThread currentThread]);
        }
        dispatch_sync(loginQueue, ^{
         NSLog(@"用户登录 %@",[NSThread currentThread]);
        });
    
        dispatch_async(loginQueue, ^{
            NSLog(@"用户支付 %@",[NSThread currentThread]);
        });
    
        dispatch_async(loginQueue, ^{
         NSLog(@"用户下载 %@",[NSThread currentThread]);
        });
    };

    dispatch_async(loginQueue, task);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容