GCD线程随笔

来源:互联网 发布:网络自由闭关锁国2017 编辑:程序博客网 时间:2024/06/03 16:14

1  GCD提供两种类型的queue,在

dispatch_queue_t queue = dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t  _Nullable attr#>)

第一个参数一般使用逆序全称域eg: com.example.customtypeQueue,第二个参数使用DISPATCH_QUEUE_SERIAL 或者 DISPATCH_QUEUE_CONCURRENT,一般只在引起资源竞争的操作是使用 DISPATCH_QUEUE_SERIAL类型的queue 来避免资源竞争,大部分情况下依然使用DISPATCH_QUEUE_CONCURRENT类型的queue.同步执行为顺序执行,按照添加任务的先后顺序顺序执行,并行执行不按照先后顺序,同时执行多个任务,

   1 当向serial类型的queue使用dispatch_asyn多次添加任务后,任务的执行会按照添加的先后顺序顺序执行(串行),但是,当创建多个serial类型的queue时,并且给每个queue分别添加任务后,这些任务的执行顺序是不分先后的,即多个serial类型的queue之间依然是并行执行,互不影响;

         (在手动创建的串行队列中添加异步(并发)执行的任务,任务的执行也是同步执行)

     2  当向同一个concurrent类型的queue使用dispatch_asyn添加多个任务后,这些任务的执行是并行执行的;      

         (当向手动创建的并行队列中添加异步执行的任务,任务的执行是并行执行,多个任务之间部分先后顺序)

     3  当向serial类型的queue使用sipatch_syn多次添加任务后,任务的执行按添加任务的先后顺序串行执行;

         (当想手动创建的串行行队列中添加同步执行的任务,任务的执行仍然是同步执行)

     4  当向concurrent类型的queue使用dispatch_syn添加多个任务时,多个任务依然是按照添加的先后顺序串行执行.

         (当向手动创建的并行队列中添加同步执行的任务,任务的执行是同步执行)


    除了使用自己创建的queue外,我们还可以使用系统提供的queue,dispatch_get_main_queue()方法获得当前程序的主线程,主线程只有一个,值得注意的是该线程属于DISPATCH_QUEUE_SERIAL类型,使用方法参考上述四点,另外还有dispatch_get_gloabal_queue(DISPATCH_QUEUE_PRIORITY_四种优先级,0)方法可以获得系统提供的四中不同优先级的queue,这四种类型的queue是DISPATCH_QUEUE_CONCURRENT类型,使用方法参考上述四点.


    另外,OC中的三种暂停方法:sleep()函数 [NSThread sleepForTimeInterval:]方法影响的是该函数所处的线程,并不一定是主线程 dispatch_after 方法一定是延迟的主线程类似于performSelector方法,使用NSTimer方法控制暂停在此就不过多描述了,网上很多. 后续会再次补上有关GCD更多的使用方法



    //dispatch_set_target_queue

    dispatch_set_target_queue(queue1, targetQueue)方法将制定queue的优先级设置为targetQueue一样的queue,targetQueue的类型SERIAL,则根据该方法设置过的queue的先后顺序,顺序执行所有被设置过的queue,若挂起某一个queue,则其他queue的执行受阻;targetQueue的类型为CONCURRENT类型,则并行执行所有被设置过的queue,若挂起某一个queue,不影响其他queue的执行.(线程挂起与恢复的方法:

 //挂起

    dispatch_suspend(<#dispatch_object_t  _Nonnull object#>)

    //恢复

    dispatch_resume(<#dispatch_object_t  _Nonnull object#>)

)

    dispatch_set_target_queue(queue1,targetQueue);

    dispatch_set_target_queue(queue2,targetQueue);

    dispatch_set_target_queue(queue3,targetQueue);

    


     

    








0 0
原创粉丝点击