zoukankan      html  css  js  c++  java
  • 五、线程管理————GCD


    本文只对GCD的其他操作进行一些补充。

    1、延迟操作

        实例:

    //延时操作
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        });
     
            /*
            dispatch_after的参数
    参数1  dispatch_time_t when
    多少纳秒之后执行
    参数2  dispatch_queue_t queue
    任务添加到那个队列
    参数3  dispatch_block_t block
    要执行的任务
        */



    2、一次性执行

    (1)定义:程序运行中只执行一次。一次性执行是线程安全的,可以使用一次性执行创建单例对象,效率比互斥锁高。

    (2)实现:可以用来创建单例对象。

        //原理:当onceToken为0时执行方法,然后将全局变量oneceToken更改为-1,以后就无法再执行。
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
        //要执行一次的代码;


        });


    3、调度组

    (1)定义:有时候需要在多个异步任务都执行完成之后继续做某些事情,比如下载歌曲,等所有的歌曲都下载完毕之后转到主线程提示用户,这样需要一个顺序的统一调度。

    (2)实现:

    //1 全局队列
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        //2 调度组
        dispatch_group_t group = dispatch_group_create();
        //3 添加任务
        //把任务添加到队列,等任务执行完成之后通知调度组,任务是异步执行
        dispatch_group_async(group, queue, ^{
            NSLog(@"歌曲1下载完毕  %@",[NSThread currentThread]);
        });
        dispatch_group_async(group, queue, ^{
            NSLog(@"歌曲2下载完毕  %@",[NSThread currentThread]);
        });
        dispatch_group_async(group, queue, ^{
            NSLog(@"歌曲3下载完毕  %@",[NSThread currentThread]);
        });
        //4 所有任务都执行完成后,获得通知 (异步执行)
        //等调度组中队列的任务完成后,把block添加到指定的队列
        dispatch_group_notify(group, queue, ^{
            NSLog(@“所有歌曲都已经下载完毕!   %@",[NSThread currentThread]);
        });
     
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            //在主线程,更新UI控件,提示用户
            NSLog(@“播放器更新完毕!  %@",[NSThread currentThread]);
        });
        NSLog(@"over");



    (3)原理:
     //1 全局队列
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
     
        //2 调度组
        dispatch_group_t group = dispatch_group_create();
     
        //ARC中不用写
    //    dispatch_retain(group);
        //3 进入调度组,执行此函数后,再添加的异步执行的block都会被group监听
        dispatch_group_enter(group);
        
        //4 添加任务一
        dispatch_async(queue, ^{
            NSLog(@“下载第一首歌曲!”);
            dispatch_group_leave(group);
            //ARC中此行不用写,也不能写
    //        dispatch_release(group);
        });


        //5 添加任务二
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            NSLog(@“下载第二首歌曲”);
            dispatch_group_leave(group);
            //ARC中此行不用写,也不能写
            //dispatch_release(group);
        });
        
        //6  获得调度组的通知
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@“歌曲都已经下载完毕! %@",[NSThread currentThread]);
        });
    //7 等待调度组 监听的队列中的所有任务全部执行完毕,才会执行后续代码,会阻塞线程(很少使用)
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

  • 相关阅读:
    02:AWT介绍
    01:GUI编程简介
    业余草 SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)
    业余草 SpringCloud教程 | 第五篇: 路由网关(zuul)(Finchley版本)
    业余草 SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)
    业余草 SpringCloud教程 | 第三篇: 服务消费者(Feign)(Finchley版本)
    业余草 SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)
    业余草 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
    业余草分享2018最新面试题总结
    业余草分享面试题,JVM结构、GC工作机制详解
  • 原文地址:https://www.cnblogs.com/David-SU/p/5274386.html
Copyright © 2011-2022 走看看