GCD1

1.gcd简介


  • GCD是苹果公司为多核的并行运算提出的解决方案
  • GCD会自动利用更多的CPU内核(比如双
    • 全称是Grand Central Dispatch
    • 纯C语言的,提供了非常多强大的函数
  • 核、四核)
  • GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
  • 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

2.gcd 核心:将任务添加到队列

任务:执行什么操作(方法或者函数)

队列:存放任务的数据结构

使用步骤:

    1.创建任务

    2.将任务添加到队列中

3.队列的类型:

串行队列:特点  任务一个一个按照顺序执行(完成一个任务才能从队列中去下一个任务)

并发队列:特点  可以同时调度多个任务并发执行   并发功能只有在异步函数的情况下才有效果

  • 同步的方式执行任务:在当前线程中依次执行任务

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

queue:队列

block:任务

  • 异步的方式执行任务:新开线程,在新线程中执行任务

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

  • 如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度新线程执行异步任务

4.模式组合

串行队列  同步执行:不开新线程,使用主线程,一个一个顺序执行
串行队列  异步执行:开一线程,一个一个顺序执行
并发队列  同步执行:不开线程,使用主线程,一个一个顺序执行
并发队列  异步执行:开多个线程,具体开多少个,和底层的线程池关系,并发无序执行

**从一下代码中可以总结出
//并发队列 同步执行
- (void)testGcd1
{
    //创建队列
    dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_CONCURRENT);
    //创建任务
    for(int i=0;i<10;i++)
    {
        dispatch_sync(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}
//并发队列 异步执行
- (void)testGcd2
{
    dispatch_queue_t queue = dispatch_queue_create("test2", DISPATCH_QUEUE_CONCURRENT);
    
    for(int i=0;i<10;i++)
    {
        dispatch_async(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}
//串行队列 同步执行
- (void)testGcd3
{
    //创建队列
    dispatch_queue_t queue = dispatch_queue_create("test3", DISPATCH_QUEUE_SERIAL);
    //创建任务
    for(int i=0;i<10;i++)
    {
        dispatch_sync(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}
//串行队列 异步执行
- (void)testGcd4
{
    dispatch_queue_t queue = dispatch_queue_create("test4", DISPATCH_QUEUE_SERIAL);
    
    for(int i=0;i<10;i++)
    {
        dispatch_async(queue, ^{
            NSLog(@"%@ ----- %d",[NSThread currentThread],i);
        });
    }
}




总结:开不开线程由同步和异步决定   ,开多少个线程由 串行和并发 来决定
串行队列只开1 个线程      并发队列开多个线程

5.系统默认提供了两个队列:
    主队列:
   主队列的特点:主队列中的任务只能在主县城空闲的时候才会被调度
   又叫全局串行队列,程序启动默认为我门创建了主队列,在使用的时候不需要创建,
直接get.
   dispatch_get_main_queue();
    全局队列
   特点:本质上还是并发队列,全局队列在mrc的情况下,不用release(只有一个)
           dispatch_get_global_queue(0,0):第一个参数:iOS 8 服务质量 ios7 优先级
           第二个参数,未来使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章