笔记:对多线程技术GCD的简单总结

提到 GCD 首先应该明白六个概念:串行队列(DISPATCH_QUEUE_SERIAL)、并行队列(DISPATCH_QUEUE_CONCURRENT)、同步执行(dispatch_sync)、异步执行(dispatch_async)、 全局队列和主队列,今天主要是先总结一下前四个概念,因为全局队列和主队列比较重要,是最常用到了,放到下一章单独讲。

串行队列:队列中的任务是顺序地执行,前一个任务执行完之后再执行下一个任务,一个接一个的执行。(中午排队买饭)

并行队列:队列中的任务是同时地执行,齐头并进。(赛跑)

同步执行:在当前线程中执行 + 等待任务执行完毕

异步执行:在子线程中执行 + 不等待任务执行完毕


看代码:

一、串行队列同步执行:(在当前线程中顺序的执行,等待任务执行结束再执行下面的代码)

- (void)viewDidLoad {
    [super viewDidLoad];
    [self serialQueueSync];
    
}
// 串行队列同步执行
-(void)serialQueueSync{
    //创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("firstSerialQueue", DISPATCH_QUEUE_SERIAL);
    NSLog(@"现在开始执行了--%@",[NSThread currentThread]);
    
    //添加两个任务到队列中 同步执行
    dispatch_sync(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"+++++++%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印+结束");
    
    dispatch_sync(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"_______%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印-结束");
    
}
结果打印:
2018-03-17 15:48:13.781 3[2075:153871] 现在开始执行了--<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:14.782 3[2075:153871] +++++++<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:15.783 3[2075:153871] +++++++<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:16.785 3[2075:153871] +++++++<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:17.786 3[2075:153871] +++++++<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:18.788 3[2075:153871] +++++++<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:18.788 3[2075:153871] 打印+结束
2018-03-17 15:48:19.790 3[2075:153871] _______<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:20.791 3[2075:153871] _______<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:21.792 3[2075:153871] _______<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:22.793 3[2075:153871] _______<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:23.794 3[2075:153871] _______<NSThread: 0x60000007ea00>{number = 1, name = main}
2018-03-17 15:48:23.795 3[2075:153871] 打印-结束


二、并行队列同步执行(虽然并行队列是同时执行,但因为是同步执行,所以是在当前的线程顺序执行)

// 并行队列同步执行
-(void)concurrentQueueSync{
    // 创建并行对列
    dispatch_queue_t queue = dispatch_queue_create("firstConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"开始执行了--%@",[NSThread currentThread]);
    
    // 添加两个任务到队列中同步执行
    dispatch_sync(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"+++++++%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印+结束%@",[NSThread currentThread]);
    dispatch_sync(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"------%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印-结束%@",[NSThread currentThread]);
    
}

打印结果:

2018-03-17 16:02:00.807 3[2302:182308] 开始执行了--<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:01.809 3[2302:182308] +++++++<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:02.810 3[2302:182308] +++++++<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:03.812 3[2302:182308] +++++++<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:04.814 3[2302:182308] +++++++<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:05.815 3[2302:182308] +++++++<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:05.816 3[2302:182308] 打印+结束<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:06.817 3[2302:182308] ------<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:07.819 3[2302:182308] ------<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:08.821 3[2302:182308] ------<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:09.823 3[2302:182308] ------<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:10.824 3[2302:182308] ------<NSThread: 0x600000070500>{number = 1, name = main}
2018-03-17 16:02:10.825 3[2302:182308] 打印-结束<NSThread: 0x600000070500>{number = 1, name = main}


三、串行队列异步执行(在子线程中一个接一个地执行,不等待任务执行结束)

// 串行队列异步执行
-(void)serialQueueAsync{
    // 创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("secondSerialQueue", DISPATCH_QUEUE_SERIAL);
    
    // 添加两个任务到串行队列中异步执行
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"+++++++%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印+结束%@",[NSThread currentThread]);
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"-------%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印-结束%@",[NSThread currentThread]);
    
}

打印结果:

2018-03-17 16:12:31.110 3[2465:203817] 打印+结束<NSThread: 0x60000006bec0>{number = 1, name = main}
2018-03-17 16:12:31.111 3[2465:203817] 打印-结束<NSThread: 0x60000006bec0>{number = 1, name = main}
2018-03-17 16:12:32.113 3[2465:204136] +++++++<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:33.118 3[2465:204136] +++++++<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:34.124 3[2465:204136] +++++++<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:35.129 3[2465:204136] +++++++<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:36.131 3[2465:204136] +++++++<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:37.137 3[2465:204136] -------<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:38.141 3[2465:204136] -------<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:39.142 3[2465:204136] -------<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:40.143 3[2465:204136] -------<NSThread: 0x600000075600>{number = 3, name = (null)}
2018-03-17 16:12:41.145 3[2465:204136] -------<NSThread: 0x600000075600>{number = 3, name = (null)}


四、并行队列异步执行(在子线程中同时执行,不等待任务执行结束)

// 并行队列异步执行
-(void)concurrentQueueAsync{
    // 创建并行队列
    dispatch_queue_t queue = dispatch_queue_create("secondConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    // 添加两个任务到并行队列中异步执行
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"+++++++%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印+结束%@",[NSThread currentThread]);
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i ++) {
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"-------%@",[NSThread currentThread]);
        }
    });
    NSLog(@"打印-结束%@",[NSThread currentThread]);
    
}

打印结果:

2018-03-17 16:17:21.031 3[2548:213984] 打印+结束<NSThread: 0x6080000678c0>{number = 1, name = main}
2018-03-17 16:17:21.031 3[2548:213984] 打印-结束<NSThread: 0x6080000678c0>{number = 1, name = main}
2018-03-17 16:17:22.036 3[2548:214042] +++++++<NSThread: 0x600000071cc0>{number = 3, name = (null)}
2018-03-17 16:17:22.036 3[2548:214040] -------<NSThread: 0x60800006ab00>{number = 4, name = (null)}
2018-03-17 16:17:23.041 3[2548:214042] +++++++<NSThread: 0x600000071cc0>{number = 3, name = (null)}
2018-03-17 16:17:23.041 3[2548:214040] -------<NSThread: 0x60800006ab00>{number = 4, name = (null)}
2018-03-17 16:17:24.047 3[2548:214040] -------<NSThread: 0x60800006ab00>{number = 4, name = (null)}
2018-03-17 16:17:24.047 3[2548:214042] +++++++<NSThread: 0x600000071cc0>{number = 3, name = (null)}
2018-03-17 16:17:25.053 3[2548:214042] +++++++<NSThread: 0x600000071cc0>{number = 3, name = (null)}
2018-03-17 16:17:25.053 3[2548:214040] -------<NSThread: 0x60800006ab00>{number = 4, name = (null)}
2018-03-17 16:17:26.057 3[2548:214042] +++++++<NSThread: 0x600000071cc0>{number = 3, name = (null)}
2018-03-17 16:17:26.057 3[2548:214040] -------<NSThread: 0x60800006ab00>{number = 4, name = (null)}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值