线程2.GCD

1.GCD


GCD(Grand Central Dispatch) ---- '牛逼的中枢调度器'!

// C语言框架 / 自动管理线程的生命周期(创建/释放)


推出GCD的目的:取代NSThread!

    

    "多核""并行"运算提出的解决方案!

    

    优点:

    <1> GCD 能够自动利用更多的CPU的核数(双核/四核)!

    <2> GCD 会自动管理线程的生命周期.


1.2 GCD中的两个核心概念:

    

    "任务":

        想要做的事情/执行什么操作.

        GCD 中的任务定义在block.

        void (^myBlock)() = ^{

            // 想要做的事情/任务

        }

    

    "队列":

        用来'存放'任务!





2.队列

串行、并行 是队列的类型。

队列 != 线程!

    队列中存放的任务最后都要由线程来执行!

    

    队列的原则:先进先出,后进后出(FIFO/ First In First Out)!


2.1 队列的类型:

    <1'串行'队列:(Serial Dispatch Queue)

    存放按顺序执行的任务!(一个任务执行完毕,再执行下一个任务)!

    

    // 创建一个串行队列

    dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);

    

    <2'并发'队列:(Concurrent Dispatch Queue)

    存放想要同时(并发)执行的任务!

    

    // 创建一个并发队列

    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);



注意两个非常常用的特殊队列:

    

    <1主队列// UI 操作放在主队列中执行!

        跟主线程相关联的队列!

        主队列是 GCD 自带的一种特殊的串行队列!

        主队列中的任务都会在主线程中执行!

    //获取主队列

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    

    <2全局并发队列// 一般情况下,并发任务都可以放在全局并发队列中!

    //获取全局并发队列

    dispatch_queue_t globalQueue = dispatch_get_global_queue(00);



串行,并行是队列的特征。同步,异步是线程的执行节奏


3. GCD使用


GCD中有两个用来执行任务的函数:

    

    '同步'执行任务:

    dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

    

    '异步'执行任务:

    dispatch_async(dispatch_queue_t queue, <#^(void)block#>)


    // <#dispatch_queue_t queue#> :队列

    // <#^(void)block#>:任务


"同步""异步"的区别:

    "同步"只能在'当前'线程中执行任务,不具备开启新线程的能力.

    "异步"可以在''的线程中执行任务,具备开启新线程的能力.


GCD 使用有两个步骤:

    <1将任务添加到队列中;

    <2选择同步还是异步的方式执行任务.


异步队列才有开启新线程的能力。

1> dispatch_async + 全局并发队列 (可以开启多条线程)

2> dispatch_async + 自己创建的串行队列 (开启一条线程)



同步+串行:顺序执行 (同步不开新线程)

同步+并发:顺序执行 (同步不开新线程)

异步+并发:开启多条线程,同时执行

异步+串行:开启一条子线程,顺序执行



阻塞式函数 全局并发没效果.只能是自定义的并发队列

dispath_barrier_async{}


你可能感兴趣的:(线程2.GCD)