zoukankan      html  css  js  c++  java
  • IOS 多线程 GCD的使用

     GCD基本概念

        优势:自动利用更多的CPU内核,为多核的并行提出解决方案,自动管理线程的生命周期

        核心概念:任务、队列

     任务:执行什么操作

     队列:执行什么任务    类型:并发、串行

     将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行,任务的取出遵循队列的  FIFO原则:先进先出,后进后出

       

                              并发队列                 手动创建串行队列            主队列

     同步 (sync)       没有开启新线程            没有开启新线程           没有开启新线程

                             串行执行任务              串行执行任务             串行执行任务

     异步 (async)        开启新线程                有新线程开启             没有开启新线程 

                              并发执行任务              串行执行任务             串行执行任务

     同步和异步主要影响:能不能开启新的线程

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

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

     并发和串行主要影响:任务的执行方式

     并发:允许多个任务并发(同时)执行

     串行:一个任务执行完毕后,再执行下一个任务

    #pragma mark - 主线程
    //  主线程只能开异步,开同步会阻塞线程 产生死锁
        dispatch_queue_t mainqueue=dispatch_get_main_queue();
        dispatch_async(mainqueue, ^{
            NSLog(@"aaaa");
        });
    #pragma mark - 子线程(后台线程)
        dispatch_queue_t global=dispatch_get_global_queue(0, 0);
        dispatch_async(global, ^{
            NSLog(@"子线程");
        });
        
    #pragma mark - 一次性线程
        //某段代码在程序运行过程中只被执行1次
        static dispatch_once_t oneQueue;
        dispatch_once(&oneQueue, ^{
            NSLog(@"一次性线程");
        });
    #pragma mark - 延迟 N 秒 执行线程
        double doubleQueue=2.0;
        dispatch_time_t popTime=dispatch_time(DISPATCH_TIME_NOW, doubleQueue*NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^{
            NSLog(@"延迟两秒执行");
        });
    #pragma mark - 自定义线程
        dispatch_queue_t user_queue=dispatch_queue_create("blog.lin.com", NULL);
        dispatch_async(user_queue, ^{
            
        });
    #pragma mark -栅栏
    //   栅栏:在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
        dispatch_group_t group=dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            NSLog(@"线程一");
        });
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            NSLog(@"线程二");
        });
        
        dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
            NSLog(@"汇总结果");
            
        });
        //先让后台两个线程并行执行,然后等两个线程都结束后再汇总结果
        
    #pragma mark - 修改代码块之外的变量
        __block int i=0;
        void (^foo)(void)=^{
            i=1;
        };
        foo();//i修改成1,用__block
        
        
        //子线程嵌套主线程
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"子线程处理逻辑");
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"主线程更新UI层");
            });
        });
  • 相关阅读:
    汇编语言(王爽 第三版)实验十四
    汇编语言(王爽 第三版)实验十三
    汇编语言(王爽 第三版)实验十二
    汇编语言(王爽 第三版)实验十一
    汇编语言(王爽 第三版)实验十
    汇编语言(王爽 第三版)实验九
    汇编语言(王爽 第三版)实验七
    android SQLite数据库的基本操作
    Android异步处理系列文章四篇之四 AsyncTask的实现原理
    Android异步处理系列文章四篇之三
  • 原文地址:https://www.cnblogs.com/mojiewei/p/6692598.html
Copyright © 2011-2022 走看看