多线程 -- C语言

//依靠C语言,来执行, 效率最高

一.串行队列

    //1.创建窜行队列

        //(1)获取创建好的串行队列, 在主线程中实现线程同步

    dispatch_queue_t quene1 = dispatch_get_main_queue();

        //(2)自己创建串行队列, 任务在子线程中实现

    dispatch_queue_t quene2 = dispatch_queue_create("com.lanou3g.oa", DISPATCH_QUEUE_SERIAL); //字符串 -- 唯一标识的作用(反域名形式) DISPATCH_QUEUE_SERIAL -- 指定为串行队列

    //2.网队列中添加任务

    dispatch_async(quene2, ^{

        NSLog(@"任务1:%@", [NSThread currentThread]);

    });

  ...

    //释放

    dispatch_release(quene2);

二.并行队列

    //1.创建并行队列

    //(1)获取创建好的并行队列

    dispatch_queue_t quene1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//两个参数分别是优先级 , 预留参数

    //(2)自己创建并发

    dispatch_queue_t quene2 = dispatch_queue_create("com.lanou3g.oa", DISPATCH_QUEUE_CONCURRENT); // 参数1 -- 唯一标示

        //  参数2 -- 指定为并发队列

    //2往队列中添加任务

    dispatch_async(quene2, ^{

        NSLog(@"任务 1 :%@", [NSThread currentThread]);

    });

  ...

    //请求图片

    //跳转到主线程刷新界面

    dispatch_async(dispatch_get_main_queue(), ^{

        //更新 UI 显示图片

    });

    //释放

    dispatch_release(quene2);

三.分组任务

    //1 创建并行队列

    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //2 创建分组

    dispatch_group_t group = dispatch_group_create();

    //3 往分组中刚添加任务

    dispatch_group_async(group, quene, ^{

        NSLog(@"任务一 请求 0 - 20M 数据");

  });

  ...

    //4 当分组内的所有任务完成之后, 拼接操作

    dispatch_group_notify(group, quene, ^{

        NSLog(@"拼接数据!");

    });

    //释放

    dispatch_release(group);

    四.单例变量

static Singleton *single = nil;

static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        single = [[Singleton alloc]init];

    });

    

五.障碍

    //障碍任务的作用: 可以保证障碍之后的并发的任务, 必须在障碍之前并发的任务执行结束之后, 才可以开始执行

    //注意: 要添加障碍任务, 必须要使用自己创建的并发任务

    //创建并发任务

    dispatch_queue_t queue = dispatch_queue_create("com.lanoug.oa", DISPATCH_QUEUE_CONCURRENT);

    //往队列中添加任务

    dispatch_async(queue, ^{

        NSLog(@"A写入文件");

    });

  ...

    //添加(设置)障碍任务

    dispatch_barrier_async(queue, ^{

        NSLog(@"此处是路障任务");

    });

    dispatch_async(queue, ^{

        NSLog(@"E读取文件");

    });

    //释放

    dispatch_release(queue);

六.延迟

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        NSLog(@"5秒真男人");

    });

//dispatch_get_main_queue 在主线程中执行(默认), 如果想在子线程中执行, 此处该为子线程即可;

七.反复执行

    dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {

        NSLog(@"哈哈 - %ld", index);

    }); // size_t 之后要添加参数名 比如: index

      ***********************

    dispatch_apply(10, dispatch_get_main_queue(), ^(size_t index) {

        NSLog(@"哈哈 - %ld", index);

    });

 

posted @ 2015-09-16 20:14  kevin丶涛  阅读(223)  评论(0编辑  收藏  举报