`
wx1568847608
  • 浏览: 14236 次
文章分类
社区版块
存档分类
最新评论

GCD队列

 
阅读更多

//

//  ViewController.m

//  07-GCD队列

//

//  Created by Jarvan on 16/7/26.

//  Copyright © 2016年 Jarvan. All rights reserved.

//锁的概念:同一时间只允许一个线程访问一段数据

 

#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<UITouch *> *)touches withEvent:(UIEvent *)event{

    /** 

     - 同步和异步主要影响:具不具备开启新的线程 (并不代表一定会开线程!);

     - 并行和串行主要影响:任务的执行方式;

     

     dispatch_async: 异步

     dispatch_sync: 同步

     

     1、异步 + 并发队列   (经常使用)

     2、异步 + 串行队列

     

     3、同步 + 并发队列

     4、同步 + 串行队列

     

     5、异步 + 主队列 (线程间通信)

     6、同步 + 主队列 (面试,不能用)

     */

 

    // 1、异步 + 并发队列

//    [self asyncGlobalQueue];

    

    // 2、异步 + 串行队列

//    [self asyncSerialQueue];

    

    // 3、同步 + 并发队列

//    [self syncGlobalQueue];

    

    // 4、同步 + 串行队列

//    [self syncSerialQueue];

    

    // 5、异步 + 主队列 (线程间通信)

//    [self asyncMainQueue];

    

    // 6、同步 + 主队列

    [self syncMainQueue];

}

 

/** 

 6、同步 + 主队列

 

 syncMainQueue方法(任务1 + 任务2 + 任务3 + 任务4)

 任务1

 任务2

 任务3

 任务4

 */

- (void)syncMainQueue{

    NSLog(@"-----------");

    

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"1-%@",[NSThread currentThread]);

    });

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"2-%@",[NSThread currentThread]);

    });

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"3-%@",[NSThread currentThread]);

    });

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"4-%@",[NSThread currentThread]);

    });

    

    NSLog(@"+++++++++");

}

 

 

/** 

 5、异步 + 主队列 (线程间通信)

 会不会开启线程: 不会开启线程 (异步是有能力开启,但不一定开启)

 主队列: 一个一个执行

 

 备注: 主队列中,必须是异步!!!!

 */

- (void)asyncMainQueue{

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"1-%@",[NSThread currentThread]);

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"2-%@",[NSThread currentThread]);

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"3-%@",[NSThread currentThread]);

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"4-%@",[NSThread currentThread]);

    });

}

 

 

/** 

 4、同步 + 串行队列

 会不会开启线程: 不会开启线程 (主线程中执行)

 执行方式: 一个一个执行

 */

- (void)syncSerialQueue{

    // 1、串行队列

    dispatch_queue_t queue = dispatch_queue_create("syncSerialQueue", NULL);

    

    // 2、添加任务

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

}

 

/** 

 3、同步 + 并发队列

 会不会开启线程: 不会开启线程(主线程中执行)

 执行方式: 因为不能开启线程,所以只能在一个线程中执行,即只能是一个一个执行

 */

- (void)syncGlobalQueue{

    // 1、全局队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

    // 2、添加任务

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

}

 

/** 

 2、异步 + 串行队列

 会不会开启线程: 会开启线程

 执行方式: 一个一个任务执行

 */

- (void)asyncSerialQueue{

    // 1、获取串行队列

    // label: 队列标识

    dispatch_queue_t queue = dispatch_queue_create("asyncSerialQueue", NULL);

    

    // 2、添加任务

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

}

 

/** 

 1、异步 + 并发队列

 会不会开启线程: 会开启线程

 执行方式: 多个任务同时执行

 */

- (void)asyncGlobalQueue{

    // 1、并发队列(全局队列)

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

    // 2、添加任务

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载5",[NSThread currentThread]);

    });

}

 

@end

转载于:https://my.oschina.net/u/3389486/blog/868491

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics