zoukankan      html  css  js  c++  java
  • GCD同步异步 串行并行大解析

    /**
     核心概念
     任务:block里需要执行的操作
     队列:把任务添加进入队列中,按照先进先出的原则来执行任务
     
     串行队列:一个一个的执行
     并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。
     
     同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行
     异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻  执行任务
     
     同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务
     同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务
     异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行
     异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
     
     主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI)
     异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务
     同步任务主队列:死锁
     
     全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级
     
     开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程)
     开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程,具体多少个由任务的数量和GCD的底层来决定的
     

     */


    //串行队列:一个一个执行
    //同步操作:不开启新的线程
    //执行结果:不开启新的线程,一个一个顺序执行

    - (void)gcdTest1 {
       
        //label:队列名
        //attr:队列属性(串行,并发)
        //DISPATCH_QUEUE_SERIAL 串行
        //DISPATCH_QUEUE_CONCURRENT 并发
       
        //#define DISPATCH_QUEUE_SERIAL NULL
       
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);
       
        NSLog(@"开始");
        //同步操作
        //操作任务:block
        dispatch_sync(queue, ^{
            //打印当前线程
            NSLog(@"%@",[NSThread currentThread]);
        });
       
        NSLog(@"结束");
          
    }


    //串行队列:一个一个执行
    //异步操作:会开启新的线程
    //执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行

    - (void)gcdTest2 {
       
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);
       
       
        NSLog(@"开始");
       
        for (NSInteger i = 0 ; i < 10; i ++ ) {
           
            //异步请求
            dispatch_async(queue, ^{
               
                NSLog(@"%@,%@",[NSThread currentThread],@(i));
               
            });
        }
       
        NSLog(@"结束");
       
       
    }


    //并发队列:多个线程同时执行
    //异步操作:会开启新的线程
    //执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

    - (void)gcdTest3 {
       
        //开启并发队列
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
       
        NSLog(@"开始");
       
        for (NSInteger i = 0 ; i < 10; i ++ ) {
           
            //执行异步操作
            dispatch_async(queue, ^{
               
                NSLog(@"%@",[NSThread currentThread]);
            });
        }
       
        NSLog(@"结束");
    }


    //并发队列:多个线程同时执行
    //同步操作:不会开启新的线程
    //执行结果:不会开启新的线程,立即执行

    - (void)gcdTest4 {
       
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
       
        NSLog(@"开始");
       
        for (NSInteger i = 0 ; i < 10; i ++ ) {
           
            dispatch_sync(queue, ^{
                NSLog(@"%@,%@",[NSThread currentThread],@(i));
            });
        }
       
        NSLog(@"结束");
    }



    主队列的异步操作
    - (void)gcdTest5 {
       
        // 主队列就是一种特殊的串行队列
        // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行
       
        dispatch_queue_t queue = dispatch_get_main_queue();
       
        NSLog(@"开始");
       
        for (NSInteger i = 0; i < 10; i ++) {
            //主队列执行异步操作,异步操作有一个等待的过程
            dispatch_async(queue, ^{
                NSLog(@"%@",[NSThread currentThread]);
            });
        }
       
        NSLog(@"结束");
    }

    主队列的同步操作

    - (void)gcdTest6 {
       
        dispatch_queue_t queue = dispatch_get_main_queue();
       
        NSLog(@"1");
       
        //在主队列里执行同步操作,产生死锁
       
        //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。
       
        dispatch_sync(queue, ^{
            NSLog(@"2");
        });
       
        NSLog(@"3");

    }



    - (void)gcdTest7
    {
        //全局队列
        //identifier  队列优先级
        //flags  苹果预留的参数(没有用)
        //DISPATCH_QUEUE_PRIORITY_DEFAULT  一般使用默认优先级
       
        //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
       
        //默认是并发队列,dispatch_get_global_queue用的多
       
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
       
        for (NSInteger i = 0; i < 10; i++) {
           
            //并发加异步
            dispatch_async(queue, ^{
               
                NSLog(@"%@",[NSThread currentThread]);
               
            });
           
        }

    }



    GCD进程间通信

    //button的响应方法
    - (IBAction)downLoadImage:(id)sender {
       
        NSLog(@"%@",[NSThread currentThread]);
       
        //获取全局队列
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
       
        //执行异步操作
        dispatch_async(queue, ^{
       
            NSLog(@"%@",[NSThread currentThread]);
           
            NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";
           
            NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
           
            UIImage * image = [UIImage imageWithData:data];
           
            //返回主线程更新UI
            dispatch_async(dispatch_get_main_queue(), ^{
               
                NSLog(@"%@",[NSThread currentThread]);

                self.imageView.image = image;

            });
        });
       
    }

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
       
        //同步操作用途
       
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
       
        dispatch_sync(queue, ^{
            NSLog(@"登录");
        });
       
        dispatch_async(queue, ^{
            NSLog(@"下载小说A");
        });
       
        dispatch_async(queue, ^{
            NSLog(@"下载小说B");
        });
       
    }

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【往事亦如风】!

  • 相关阅读:
    2019-2020-2 20175227张雪莹《网络对抗技术》 Exp3 免杀原理与实践
    2019-2020-2 20175227张雪莹《网络对抗技术》 Exp2 后门原理与实践
    2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解
    USCOSII
    office word excel等图标显示异常
    Mysql事务
    Mysql 主备配置
    查看mysql已有用户并删除
    在linux下面安装mysql 确认 配置文件路径 my.cnf
    yum提示Another app is currently holding the yum lock; waiting for it to exit...
  • 原文地址:https://www.cnblogs.com/ldnh/p/5277488.html
Copyright © 2011-2022 走看看