美文网首页iOS Developer程序员
并发队列,串队列,栅栏队列,组队列

并发队列,串队列,栅栏队列,组队列

作者: LeeDev | 来源:发表于2017-02-21 14:29 被阅读135次

更加深刻的去理解,并发队列,串队列,栅栏队列,组队列

对于barrier队列的同步和异步问题

//
//  ViewController.m
//  GCD DEV
//
//  Created by mac on 2017/2/21.
//  Copyright © 2017年 mac. 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.
    
    [self groupQueue];
    
}

/* 并发队列 **/
- (void)concurrentQueue {
    
    //并发
    dispatch_queue_t dispatch_queue = dispatch_queue_create("com.lee.dev", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(dispatch_queue, ^{
        
        sleep(1);
        NSLog(@"1");
    });
    dispatch_async(dispatch_queue, ^{
        
        sleep(2);
        NSLog(@"2");
    });
    
    /*
     *作用在 并发队列中 ,相当于一个栅栏,只有等这个栅栏的东西执行完了才往下走
     *但是注意的如果里面有一个 全局的异步线程
     **/
    dispatch_barrier_async(dispatch_queue, ^{
        
        sleep(3);
        NSLog(@"barrier");
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            sleep(3);
            NSLog(@"global_queue");
        });
    });
    
    dispatch_async(dispatch_queue, ^{
        NSLog(@"3");
    });
    dispatch_async(dispatch_queue, ^{
        NSLog(@"4");
    });
}

/* 同步队列 **/
- (void)serialQueue {
    
    //同步
    dispatch_queue_t dispatch_queue = dispatch_queue_create("com.lee.dev", DISPATCH_QUEUE_SERIAL);
    dispatch_async(dispatch_queue, ^{
        
        sleep(3);
        NSLog(@"同步:1");
    });
    dispatch_async(dispatch_queue, ^{
        
        sleep(2);
        NSLog(@"同步:2");
    });
    dispatch_async(dispatch_queue, ^{
        NSLog(@"同步:3");
    });
    dispatch_async(dispatch_queue, ^{
        NSLog(@"同步:4");
    });
}

/*
 * group 队列
 **/
- (void)groupQueue {
    
    NSArray *strings = @[@"http://img.wdjimg.com/image/video/d999011124c9ed55c2dd74e0ccee36ea_0_0.jpeg",
                         @"http://img.wdjimg.com/image/video/2ddcad6dcc38c5ca88614b7c5543199a_0_0.jpeg",
                         @"http://img.wdjimg.com/image/video/6d6ccfd79ee1deac2585150f40915c09_0_0.jpeg",
                         @"http://img.wdjimg.com/image/video/2111a863ea34825012b0c5c9dec71843_0_0.jpeg",
                         @"http://img.wdjimg.com/image/video/b4085a983cedd8a8b1e83ba2bd8ecdd8_0_0.jpeg",
                         @"http://img.wdjimg.com/image/video/2d59165e816151350a2b683b656a270a_0_0.jpeg",
                         @"http://img.wdjimg.com/image/video/dc2009ee59998039f795fbc7ac2f831f_0_0.jpeg"];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{

        NSError * error = nil;
        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strings[0]] options:NSDataReadingMappedIfSafe error:&error];
        NSLog(@"NSThread_1:error:%@;length:%ld",error,data.length);
    });
    dispatch_group_async(group, queue, ^{
        
        NSError * error = nil;
        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strings[1]] options:NSDataReadingMappedIfSafe error:&error];
        NSLog(@"NSThread_2:error:%@;length:%ld",error,data.length);
    });
    dispatch_group_async(group, queue, ^{
        
        NSError * error = nil;
        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strings[2]] options:NSDataReadingMappedIfSafe error:&error];
        NSLog(@"NSThread_3:error:%@;length:%ld",error,data.length);
    });
    
    /* 通知**/
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        
        NSLog(@"UI Op");
    });
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

相关文章

  • 多线程的运用

    同步串行队列 同步并发队列 异步串行队列 异步并发队列 队列组 栅栏 队列组和栅栏的组合 信号量 死锁主线程 分析...

  • 并发队列,串队列,栅栏队列,组队列

    更加深刻的去理解,并发队列,串队列,栅栏队列,组队列 对于barrier队列的同步和异步问题

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • iOS 的串行队列和并发队列中的任务是如何执行的

    我们都知道队列有串行队列和并发队列,主队列就属于串行队列,串行队列里面的任务是按顺序执行,并发队列里的任务是并发执...

  • iOS GCD笔记

    串行队列 并发队列 主队列 全局并发队列 同步执行 异步执行 同步+并发队列 = 没有开启新线程,串行执行任务 s...

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • iOS多线程-队列优先级

    全局队列 全局队列(本质上并发队列)

  • GCD队列使用

    使用GCD前,先对队列总结一下: 串行和并发 GCD中队列分为两种:串行队列、并发队列。串行队列:任务按在队列里的...

  • dispatch_barrier_sync和dispatch_b

    写在最前面:在使用栅栏函数时.使用自定义队列才有意义,如果用的是串行队列或者系统提供的全局并发队列,这个栅栏函数的...

  • iOS开发-队列和同步异步执行的结果分析

    多线程中的队列有:串行队列,并发队列,全局队列(并发),主队列(串行)。 执行的方法有:同步执行和异步执行。 提到...

网友评论

    本文标题:并发队列,串队列,栅栏队列,组队列

    本文链接:https://www.haomeiwen.com/subject/zvddwttx.html