GCD

1.GCD是最简单的一种多线程,同时也是效率最高的一种方式(全部是用C语言代码编写的API),也是苹果过公司主推的一种多线程方式

2.GCD通过queue来实现多线程

3.GCD里面有多种queue一种是串行serial一种是并行concurrent

pragma mark-------------serial串行队列第一种------------------------

    //serial:第一个任务执行完毕,第二个任务才开始执行,依次类推
    //有两种方式
//获取主线程
//    dispatch_queue_t queue = dispatch_get_main_queue();
    //往队列里面添加任务
    
//    dispatch_async(queue, ^{
//        NSLog(@"这是第一个任务,当前线程%@,是否主线%d",[NSThread currentThread],[[NSThread currentThread]isMainThread]);
//    });
//    
//   
//     dispatch_async(queue, ^{
//         NSLog(@"这是第二个任务,当前线程%@,是否主线程 %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
//     });
//    
//    
//    dispatch_async(queue, ^{
//        NSLog(@"这是第三个任务当前线程%@ ,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
//    });
//    
//    dispatch_async(queue, ^{
//        NSLog(@"这是第四个第四个任务但钱线程%@,是否主线程 %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
//    });

pragma mark -------------serial串行队列第二种-----------

/*
     *获取串行队列的第二种方式,自己创建队列。
     
     
        *穿件串行队列的第二种方式
         “serialQueue” 对列的名字 (苹果主推使用反向域名法去命名)
           DISPATCH_QUEUE_SERIAL  队列类型
     
     
          手动创建的串行队列不在主线程中
        */
     
     //dispatch_sync 是主线程 dispatch_async不是主线程
    
    
    dispatch_queue_t queue = dispatch_queue_create("com.serialQueue.www", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        NSLog(@"这是一个任务,当前 线程%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"这是第二个任务,但钱线程%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"这是3%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"只是第四个%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    
    dispatch_async(queue, ^{
        NSLog(@"这是5个任务,当前 线程%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"这是第6个任务,但钱线程%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"这是7%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"只是第8个%@,是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });

concurrentQueue 特点:第一个任务执行开始之后,第二个任务不等第一个执行完毕直接开始执行,以此类推,后边的任务跟前面的任务没有关系(先添加的任务不一定先执行,最后添加的任务不一定最后执行),并列队列会根据队列里面的任务数量、cpu、使用情况开辟最合适的线程数量去完成队列里面的任务 创建有两种方式

pragma mark ------concurrentQueue第一种创建方式-------------

// 创建并行队列
    
//global queue 是苹果里面的全局队列,有4个优先级
    
//   #define DISPATCH_QUEUE_PRIORITY_HIGH 2
//   #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
//   #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
//   #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

    
   //第一个参数就是队列的优先级 第二个参数就是苹果预留的参数为了以后使用,目前还没有使
//    dispatch_queue_t queue = dispatch_queue_create("com.concurrent.www", DISPATCH_QUEUE_CONCURRENT);
//    
//    dispatch_async(queue, ^{
//        NSLog(@"1%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
//    });
//    
//    dispatch_async(queue, ^{
//        NSLog(@"2%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread]isMainThread]);
//    });
//    
//    dispatch_async(queue, ^{
//        NSLog(@"3%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
//    });
//    
//    dispatch_async(queue, ^{
//        NSLog(@"4%@ 是否主%d",[NSThread currentThread] ,[[NSThread currentThread] isMainThread]);
//    });

pragma mark ------concurrentQueue第二种创建方式-------------

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSLog(@"线程1%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
        
        
    });
    
    dispatch_async(queue, ^{
        NSLog(@"线程2%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    
    dispatch_async(queue, ^{
        NSLog(@"线程3%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"线程4%@ 是否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"线程5%@ 谁否主%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });

延迟执行代码 (dispatch——after 可以再任何队列中执行,串行并行都可以)

//第一种
//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//        NSLog(@"我是延迟执行的代码 线程:%@ 是否是主线程%d",[NSThread currentThread],[[NSThread currentThread]isMainThread]);
//    });
    
    
    //第二种
    
    dispatch_time_t seconds = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC));
    //创建一个全局队列
    
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
     dispatch_after(seconds, queue,^{
         NSLog(@"我是延迟执行的代码%@ 是否主线程%d",[NSThread currentThread],[[NSThread  currentThread]isMainThread ]);
     });
    

线程组


  //dispatch—Group-t主要是一些不想管的任务归为一组
    //组里面放到是队列
    //dispatch-group-async 作用是给组里面的队列添加任务
    //dispatch-group-notify 作用是坚挺组里面的任务,等到组里面的任务全部执行完成之后,才执行它里面的任务
    
    //第一步创建组
    
    
       dispatch_group_t group = dispatch_group_create();
    
    //创建全局对列
    
    dispatch_queue_t queue = dispatch_queue_create(0, 0);
    
    //往组里面的队列添加任务
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第一个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"我是最后一个任务,当其他任务完成之后,我再执行  线程%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第三个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第四个%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第五个%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_group_async(hroup, queue, ^{
        NSLog(@"我是第五个%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });


既有数据的写入,也有数据的读取。如何解决该类问题dispatch_barrier_async在它之前的任务可以去并发执行,在它之后的任务也可以并发执行

dispatch_queue_t  queue =  dispatch_queue_create("com.currentQueue.www", DISPATCH_QUEUE_CONCURRENT);
    
    
    dispatch_async(queue, ^{
        NSLog(@"第一个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread]isMainThread]);
    });
    
    
    dispatch_async(queue, ^{
        NSLog(@"第二个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"第三个任务%@ 是否主线成%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"第四个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    
    dispatch_async(queue, ^{
        NSLog(@"第5个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
        
    });
    
    
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"我正在读取数据,不要来打扰我%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"第6个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    
    
    dispatch_async(queue, ^{
        NSLog(@"第7个任务%@ 是否主线程%d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    

多次执行

 NSArray *array = @[@"1",@"2",@"3"];
    
    dispatch_queue_t queue = dispatch_queue_create(0, 0);
    
    /***
     *多次执行
     *
     *@param  iterations 次数
     *@param  queue      队列
     *
     *@param  size_t     任务
     *
     *
     ***/
    //index 是随机的 是小于次数的随机数
    dispatch_apply(3, queue, ^(size_t index) {
        NSLog(@"%@",array[index]);
    });

async 与 sync的区别

 //async 不等block执行完毕,就去执行下面的代码
    //sync 会等block执行完毕只后,才会去执行下面的代码

 dispatch_queue_t queue = dispatch_queue_create(0, 0);

dispatch_sync(queue, ^{
         NSLog(@"这是第一个任务");
    });
    NSLog(@"呵呵");
    dispatch_sync(queue, ^{
        NSLog(@"这是第二个任务");
    });
    NSLog(@"哦");

GCD调用函数指针


- (IBAction)functionPointer:(UIButton *)sender {
    
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    /***
     *GCD 函数做参数
     *queue 队列
     *contex 函数参数的内容
     *work 函数(函数肚饿返回值必须为void 参数类型必须为 void *)
     ***/
    
    dispatch_async_f(queue, @"呵呵", function);
    
   
    
}

void function(void *context){
    
    NSLog(@"%@",context);
    printf("哦");
}

线程互斥

线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的

// 1 创建线程锁
    
    NSLock *lock = [[NSLock alloc]init];
    
        _count = 100;//票数
    //创建线程并行队列
    
    dispatch_queue_t queue = dispatch_queue_create("com.sellTicketss.www", DISPATCH_QUEUE_CONCURRENT);
    
    __weak ViewController *weakSelf = self;
    
    for (int i =10; i>0; i--) {
        dispatch_async(queue, ^{
            [lock lock];
            for (int j = 10; j > 0; j--) {
                NSLog(@"买到了第%d张票",weakSelf.count);
                weakSelf.count -- ;
            }
            [lock unlock];
        });
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容