zoukankan      html  css  js  c++  java
  • iOS 多线程GCD的基本使用

    iOS多线程简介》中提到:GCD中有2个核心概念:1、任务(执行什么操作)2、队列(用来存放任务)

    那么多线程GCD的基本使用有哪些呢?

    可以分以下多种情况:

    1、异步函数 + 并发队列

    /**
     * 异步函数 + 并发队列:可以同时开启多条线程
     */
    - (void)asyncConcurrent
    {
        // 1.创建一个并发队列
        // dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
        // label : 相当于队列的名字
        // dispatch_queue_t queue = dispatch_queue_create("com.kyle.queue", DISPATCH_QUEUE_CONCURRENT);
        
        // 1.获得全局的并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 2.将任务加入队列
        dispatch_async(queue, ^{
            for (NSInteger i = 0; i<3; i++) {
                NSLog(@"this is first %@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (NSInteger i = 0; i<3; i++) {
                NSLog(@"this is second %@",[NSThread currentThread]);
            }
        });
        
        dispatch_async(queue, ^{
            for (NSInteger i = 0; i<3; i++) {
                NSLog(@"this is third %@",[NSThread currentThread]);
            }
        });
        
    }

    2、同步函数 + 并发队列

    /**
     * 同步函数 + 并发队列:不会开启新的线程
     */
    
    - (void)syncConcurrent
    {
        // 1.获得全局的并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 2.将任务加入队列
        dispatch_sync(queue, ^{
            NSLog(@"this is first %@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"this is second %@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"this is third %@",[NSThread currentThread]);
        });
        
    }

    3、异步函数 + 串行队列

    /**
     * 异步函数 + 串行队列:会开启新的线程,但是任务是串行的,执行完一个任务,再执行下一个任务
     */
    - (void)asyncSerial
    {
        // 1.创建串行队列
        dispatch_queue_t queue = dispatch_queue_create("com.kyle.queue", DISPATCH_QUEUE_SERIAL);
        //    dispatch_queue_t queue = dispatch_queue_create("com.kyle.queue", NULL);
        
        // 2.将任务加入队列
        dispatch_async(queue, ^{
            NSLog(@"this is first %@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"this is second %@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"this is third %@",[NSThread currentThread]);
        });
    }

    4、同步函数 + 串行队列

    /**
     * 同步函数 + 串行队列:不会开启新的线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务
     */
    - (void)syncSerial
    {
        // 1.创建串行队列
        dispatch_queue_t queue = dispatch_queue_create("com.kyle.queue", DISPATCH_QUEUE_SERIAL);
        
        // 2.将任务加入队列
        dispatch_sync(queue, ^{
            NSLog(@"this is first %@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"this is second %@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"this is third %@",[NSThread currentThread]);
        });
    }

    5、异步函数 + 主队列

    // * 异步函数 + 主队列:只在主线程中执行任务
    
    - (void)asyncMain
    {
        // 1.获得主队列
        dispatch_queue_t  queue =  dispatch_get_main_queue();
        // 2.将任务加入队列
        dispatch_async(queue, ^{
            NSLog(@"this is first %@",[NSThread currentThread]);
            NSLog(@"this is second %@",[NSThread currentThread]);
            NSLog(@"this is third %@",[NSThread currentThread]);
        });
    }

    6、同步函数 + 主队列

    // * 同步函数 + 主队列:
    - (void)syncMain
    {
        NSLog(@"begin");
        
        // 1.获得主队列
        dispatch_queue_t queue =  dispatch_get_main_queue();
        // 2.将任务加入队列
        dispatch_sync(queue, ^{
            NSLog(@"this is %@",[NSThread currentThread]);
            
        });
        NSLog(@"end");
    }

    造成“相互等待的死锁”

  • 相关阅读:
    (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案
    (转)Android 使用com.j256.ormlite
    Android中判断网络连接是否可用及监控网络状态
    2018/11/12-操作系统课笔记
    mysql的ONLY_FULL_GROUP_BY语义 --转自http://www.wtoutiao.com/p/19dh3ec.html
    nginx相关配置说明
    为重负网络优化 Nginx 和 Node.js --引用自https://linux.cn/article-1314-1.html
    windows环境下局域网内无法访问apache站点
    27个知名企业品牌VI视觉识别系统规范手册
    TopShelf&Quartz.Net实现多任务的值守
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5585954.html
Copyright © 2011-2022 走看看