码迷,mamicode.com
首页 > 编程语言 > 详细

GCD多线程的使用

时间:2016-05-09 07:02:02      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

1.GCD的核心是:将任务添加到队列;

2.GCD中的任务是使用block封装的;

3.任务的取出遵循先进先出,后进后出的原则;GCD会自动的将队列中的人物取出,放到对应的线程中执行;

4.GCD会自动的管理线程的生命周期(创建线程,调度任务,线程销毁);线程在一定的时间内可以复用;

5.GCD的队列分为两大类型:

串行队列(serial dispatch queue):任务一个接一个执行;

并发队列(concurrent):多个任务同时执行(自动开启多个线程),只有在异步的情况下才有效果.

6.主队列(全局串行队列):主队列的任务,只有主线程空闲的时候才会被调度,主队列中的任务要在主线程执行;

程序启动时就创建了主队列,使用的时候不需要创建,直接获取;

7.全局队列(并发队列):程序启动就创建好,直接get获取,不需要我们内存管理;


=====================

//自定义串行队列

    // 参数1 : 队列的标识符

    // 参数2 : 队列的属性.决定了队列的类型,即是串行还是并行(并发)

    dispatch_queue_t queue = dispatch_queue_create("CZ", DISPATCH_QUEUE_SERIAL);

//自定义并发队列

    dispatch_queue_t queue = dispatch_queue_create("CZ"DISPATCH_QUEUE_CONCURRENT);


//获取全局队列(并发):

    dispatch_queue_t global_queue = dispatch_get_global_queue(0, 0);


//获取主队列(串行):

    dispatch_queue_t queue = dispatch_get_main_queue();


=======================

异步执行:新开线程,在新线程中执行

dispatch_async(queue, ^{


                       }

同步执行:在当前线程中执行,有可能是在子线程,也有可能是在主线程;

        dispatch_sync(queue, ^{

            // 查看当前的线程

            NSLog(@"登陆 %@",[NSThread currentThread]);

        });


下面两个都是在主线程执行:

dispatch_sync(dispatch_get_main_queue(), ^{

            // 查看当前的线程

            NSLog(@"通知用户 %@",[NSThread currentThread]);

        });


 dispatch_async(queue, ^{

            // 查看当前的线程

            NSLog(@"%d %@",i,[NSThread currentThread]);

        });



=====================

队列和执行方法的总结:

并发队列--同步执行:不开线程,顺序执行;

串行队列--同步执行:不开线程,顺序执行;

串行队列--异步执行:新开1个线程,顺序执行;

并发队列--异步执行:每次开多个线程,线程数有GCD决定.

主队列 ---异步执行:不开线程,顺序执行;

朱队列----同步执行:不允许,会死锁;


=================================

一次性执行,设计单利

    // onceToken 是有一个初始值

    // 第一次执行的时候,会判断是否是初始值,如果是初始值,就执行block内部的代码

    // 第一次执行完成之前,会重置初始值为非0;



+ (instancetype)sharedAccountManager

{

    // 定义静态的空对象

    static AccountManager *manager;

    

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        manager = [[AccountManager alloc] init];

    });

    

    return manager;

}


================================

延时操作:

void dispatch_after(

                        dispatch_time_t when,

                        dispatch_queue_t queue,

                        dispatch_block_t block);

    

    /*

     参数1 : 操作延迟的时间

     参数2 : 操作添加的队列

     参数3 : 执行那个操作

     */

    

    // 参数1 : 精确到纳秒

    dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));

    // 参数2

    dispatch_queue_t queue = dispatch_get_main_queue();

    // 参数3

    void (^task)() = ^{

        // 查看当前的线程

        NSLog(@"%@",[NSThread currentThread]);

    };

    

    // 延迟多少纳秒,在哪个队列中执行那个操作

    dispatch_after(when, queue, task);


=================================================

调度组的原理:

每一个任务都有一个标记,任务完成标记移除,如果标记全部移除,会执行监听;

    // 参数1 : 调度组

    dispatch_group_t group = dispatch_group_create();

    

    // 参数2 : 队列

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    

    dispatch_group_async(group, queue, ^{

        

        // 模拟网络延迟

        [NSThread sleepForTimeInterval:1.0];

        

        // 查看当前的线程

        NSLog(@"下载图片1 %@",[NSThread currentThread]);

    });

    

    dispatch_group_async(group, queue, ^{

        // 模拟网络延迟

        [NSThread sleepForTimeInterval:0.5];

        

        // 查看当前的线程

        NSLog(@"下载图片2 %@",[NSThread currentThread]);

    });

    

    dispatch_group_async(group, queue, ^{

        // 查看当前的线程

        NSLog(@"下载图片3 %@",[NSThread currentThread]);

    });

    

    // 监听图片是否下载完成

    dispatch_group_notify(group, queue, ^{

        // 查看当前的线程

        NSLog(@"监听是否全部下载完成 %@",[NSThread currentThread]);

    });




GCD多线程的使用

标签:

原文地址:http://blog.csdn.net/u011146511/article/details/51348750

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!