iOS Developer

多线程(GCD)

2016-05-19  本文已影响49人  简简简简简书

多线程(GCD)

GCD的基本使用

    //线程间通信
    //进入子线程进行耗时操作
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"%@",[NSThread currentThread]);
        //回主线程进行刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"%@",[NSThread currentThread]);
        });
    });

GCD的两种队列

同步和异步

同步 异步
串行 没有开启线程,串行执行任务 开启一条线程,串行执行任务
并发 没有开启线程,串行执行任务 开启线程(大于等于1条,不受控制),并发执行任务

各种函数队列演示代码

同步串行(打印结果12345)

//创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("duilie", DISPATCH_QUEUE_SERIAL);
//创建一个并行队列
    dispatch_queue_t queeu = dispatch_queue_create("bbb", DISPATCH_QUEUE_CONCURRENT);
    //同步执行这个串行队列(顺序执行,不会创建新的线程)
    dispatch_sync(queue, ^{
        NSLog(@"1%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"4%@",[NSThread currentThread]);
    });
    NSLog(@"5%@",[NSThread currentThread]);

同步并行(打印结果12345)

    //同步执行一个并行队列(顺序执行,没有开启线程,只是允许并行执行,但是没有线程这个条件,实际还是串行执行)
    dispatch_sync(queeu, ^{
        NSLog(@"1%@",[NSThread currentThread]);
    });
    dispatch_sync(queeu, ^{
        NSLog(@"2%@",[NSThread currentThread]);
    });
    dispatch_sync(queeu, ^{
        NSLog(@"3%@",[NSThread currentThread]);
    });
    dispatch_sync(queeu, ^{
        NSLog(@"4%@",[NSThread currentThread]);
    });
    NSLog(@"5%@",[NSThread currentThread]);

异步串行(打印结果1234,5不一定插在1234的哪个位置,因为1234和5是并行的,1234是串行的)

    //异步执行这个串行队列(1234顺序执行,5和1234并行,开启一条线程,)
    dispatch_async(queue, ^{
        NSLog(@"1%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4%@",[NSThread currentThread]);
    });
    NSLog(@"5%@",[NSThread currentThread]);

异步并行(打印结果随机,12345五个任务执行都是并发)

    //异步执行一个并行队列(主线程和其他线程一起执行,顺序不一定,开启的线程数也不一定)
    dispatch_async(queeu, ^{
        NSLog(@"1%@",[NSThread currentThread]);
    });
    dispatch_async(queeu, ^{
        NSLog(@"2%@",[NSThread currentThread]);
    });
    dispatch_async(queeu, ^{
        NSLog(@"3%@",[NSThread currentThread]);
    });
    dispatch_async(queeu, ^{
        NSLog(@"4%@",[NSThread currentThread]);
    });
    NSLog(@"5%@",[NSThread currentThread]);

系统提供的五种队列(1主队列 + 4全局子队列)

    //1.当前队列的优先级2.没用
    /**
     * DISPATCH_QUEUE_PRIORITY_HIGH 2
     * DISPATCH_QUEUE_PRIORITY_DEFAULT 0
     * DISPATCH_QUEUE_PRIORITY_LOW (-2)
     * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
     */
    //获取到全局子队列
    dispatch_queue_t qq = dispatch_get_global_queue(0, 0);
    //获取主队列
    dispatch_queue_t q =  dispatch_get_main_queue();

GCD的其他函数

 //延时执行
    //参数:几秒后执行(填的是2,代表两秒后执行)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"延迟执行的代码片段");
    });
    NSLog(@"我先走了");
    //只执行一次(线程安全的)
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"只走一次");
    });
 //重复执行
    //1.重复的次数 2.在什么队列重复 3.当前次数的索引
    dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t a) {
        NSLog(@"%zu",a);
    }) ;
//创建一个组(先把任务放进队列里,在放进组里,组可以监听任务完毕)
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务1");
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务2");
    });
    //监听组内执行情况(监听组内所有队列执行完毕)
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"执行完毕");
    });
    //创建并发队列
    dispatch_queue_t tt = dispatch_queue_create("tt", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(tt, ^{
        NSLog(@"任务1");
    });
    dispatch_async(tt, ^{
        NSLog(@"任务2");
    });
    //单独执行
    dispatch_barrier_sync(tt, ^{
        NSLog(@"任务3");
    });
    dispatch_async(tt, ^{
        NSLog(@"任务4");
    });
    dispatch_async(tt, ^{
        NSLog(@"任务5");
    });
 dispatch_async_f(dispatch_get_global_queue(0, 0), @"1", sum);
- void sum (void *a)
{
    NSLog(@"%@",a);
}

资源抢夺

    int a = 1000;
    //资源抢夺(对象)
    //互斥锁带的参数一定要传一个对象,一般情况传self
    @synchronized(self) {
        //锁的是代码
        a = a - 1;
    }
上一篇 下一篇

猜你喜欢

热点阅读