IOS GCD线程相关内容(dispatch_sync,dispatch_async)

前言:Queue队列分为几下几种
1、全局队列:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2、主队列:dispatch_get_main_queue()
3、用户创建的串行队列:
dispatch_queue_create(“com.yuna.com”, DISPATCH_QUEUE_SERIAL/NULL);
4、用户创建的并行队列:
dispatch_queue_create(“com.yuna.com”, DISPATCH_QUEUE_CONCURRENT);

同步与异步的区别:dispatch_sync 和 dispatch_async

dispatch_sync(queue,block):同步队列,dispatch_sync 函数不会立即返回,会阻塞当前线程,将block放到指定的queue上面执行,等待该block同步执行完成后才会返回

dispatch_async(queue,block):异步队列,dispatch_sync 函数会立即返回,block放到指定queue中等待执行,该block是并行还是串行只跟queue定义有关
……………………………………………………………………………………
一个NSThread线程对象都可以有它对应的名字(name)和编号(number). 名字可以通过NSThread的name属性来设置
编号(number)是不能设置的,一般由系统决定,但主线程默认就是1,只要不为1的就是子线程

我们看下他们的几种组合情况
1、串行队列+同步

/*
 串行队列 + 同步任务:没有开启新线程,任务是逐个完成的
 */
- (void)serialSync{
    dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_SERIAL);
//    dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", NULL);
    //在队列里添加同步任务
    dispatch_sync(queue, ^{
        for(int  i=0 ; i<10;i++){
            NSLog(@"---1--%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for(int  i=0 ; i<10;i++){
            NSLog(@"---2--%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for(int  i=0 ; i<10;i++){
            NSLog(@"---3--%@",[NSThread currentThread]);
        }
    });
}

我们看下打印的结果:都是在同一个线程执行,没有开启新线程,而且是任务逐个执行的
这里写图片描述

2、 串行队列 + 异步

/*
 串行队列 + 异步任务:开启新线程,任务是逐个完成的
 */
- (void)serialAsync{
    dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_SERIAL);
    //    dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", NULL);
      NSLog(@"串行队列 + 异步----%@",[NSThread currentThread]);
    //在队列里添加异步任务
    dispatch_async(queue, ^{ 
        for(int  i=0 ; i<10;i++){
            NSLog(@"---1--%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for(int  i=0 ; i<10;i++){
            NSLog(@"---2--%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for(int  i=0 ; i<10;i++){
            NSLog(@"---3--%@",[NSThread currentThread]);
        }
    });
}

我们看下打印的结果:有个主线程,还开启了一个新的进程,任务是逐一执行的
这里写图片描述
3、 并发队列 + 同步

/*
 并发队列 + 同步任务 :没有开启新线程,任务是逐个执行
 */
-(void)createConCurrentQueueSyn{
    //创建并发队列
    dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_CONCURRENT);
     NSLog(@"并发队列 + 同步----%@",[NSThread currentThread]);
    //在队列里添加同步任务
    dispatch_sync(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---1--%@",[NSThread currentThread]);
        }
    });

    dispatch_sync(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---2--%@",[NSThread currentThread]);
        }
    });


    dispatch_sync(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---3--%@",[NSThread currentThread]);
        }
    });
}

我们看下打印的结果:都是在同一个线程中,没有开启一个新的进程,任务是逐一执行的
这里写图片描述
4、 并发队列 + 异步

/*
 并发队列 + 异步任务 :开启新线程,任务是并发的

 --1--<NSThread: 0x7fe399724ba0>{number = 2, name = (null)}
 --2--<NSThread: 0x7fe399710790>{number = 3, name = (null)}
 --3--<NSThread: 0x7fe39972c110>{number = 4, name = (null)}
 */

-(void)createConCurrentQueueAsyn{

    dispatch_queue_t queue = dispatch_queue_create("com.pi2e.com", DISPATCH_QUEUE_CONCURRENT);
     NSLog(@"并发队列 + 异步----%@",[NSThread currentThread]);
    //队列中添加异步任务
    dispatch_async(queue, ^{

        for (int i=0; i<5; i++) {
            NSLog(@"--1--%@",[NSThread currentThread]);
        }
    });


    dispatch_async(queue, ^{

        for (int i=0; i<5; i++) {
            NSLog(@"--2--%@",[NSThread currentThread]);
        }
    });

    dispatch_async(queue, ^{

        for (int i=0; i<5; i++) {
            NSLog(@"--3--%@",[NSThread currentThread]);
        }
    });
}

我们看下打印的结果:正常打印的是在主线程中执行,而dispatch_async中是block是在开启的新线程中并发执行的
这里写图片描述
5、全局队列 + 同步

/*
 全局队列 + 同步任务:,没有开启新线程,任务逐个执行
 */

-(void)GlabolSyc{

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

     NSLog(@"全局队列 + 同步----%@",[NSThread currentThread]);

    //在队列里添加同步任务
    dispatch_sync(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---1--%@",[NSThread currentThread]);
        }
    });

    dispatch_sync(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---2--%@",[NSThread currentThread]);
        }
    });


    dispatch_sync(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---3--%@",[NSThread currentThread]);
        }
    });

}

我们看下打印的结果:都是在同一个线程中执行的,并且是逐个执行
这里写图片描述
6、全局 + 异步

/*
 全局 + 异步:开启新线程,任务是并发的
 */

- (void)GlobalAsync{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     NSLog(@"全局队列 + 异步----%@",[NSThread currentThread]);
    //队列中添加异步任务
    dispatch_async(queue, ^{

        for (int i=0; i<5; i++) {
            NSLog(@"--1--%@",[NSThread currentThread]);
        }
    });


    dispatch_async(queue, ^{

        for (int i=0; i<5; i++) {
            NSLog(@"--2--%@",[NSThread currentThread]);
        }
    });



    dispatch_async(queue, ^{

        for (int i=0; i<5; i++) {
            NSLog(@"--3--%@",[NSThread currentThread]);
        }
    });
}

我们看下打印的结果:正常打印的是在主线程中执行,而dispatch_async中是block是在开启的新线程中并发执行的
这里写图片描述
7、 主队列+同步:运行后直接crash

/*
 主队列(串行)+同步:界面卡死
 主队列中添加同步任务会造成死锁的
 */

- (void)mainthreadSync{

    dispatch_queue_t queue = dispatch_get_main_queue();
     NSLog(@"主队列(串行)+同步----%@",[NSThread currentThread]);
    //在队列里添加同步任务
    dispatch_sync(queue, ^{

        for(int  i=0 ; i<10;i++){
            NSLog(@"---1--%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{

        for(int  i=0 ; i<10;i++){
            NSLog(@"---2--%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{

        for(int  i=0 ; i<10;i++){
            NSLog(@"---3--%@",[NSThread currentThread]);
        }
    });
}

8、主队列+异步

/*
 主队列(串行)+异步:没有创建新线程,任务逐个完成 {都是在主线程中执行的}
 */
- (void)mainthreadAsync{

    dispatch_queue_t queue = dispatch_get_main_queue();
     NSLog(@"主队列(串行)+异步----%@",[NSThread currentThread]);
    //在队列里添加异步任务
    dispatch_async(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---1--%@",[NSThread currentThread]);
        }
    });

    dispatch_async(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---2--%@",[NSThread currentThread]);
        }
    });


    dispatch_async(queue, ^{

        for(int  i=0 ; i<count;i++){
            NSLog(@"---3--%@",[NSThread currentThread]);
        }
    });
}

我们看下打印的结果:都是在主线程中,逐一执行的
这里写图片描述

总结:
任务:执行什么操作
同步:只能在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新线程的能力
主要区别:能否开启新的线程
………………………………………………………………
队列:用来存放任务 (FIFO)
并行队列:1、可以让多个任务并发(同时)执行(自动开启多个线程 同时执行任务)
2、并发的功能只有在异步函数下才有效
方式一:dispatch_queue_create(“com.pi2e.com”,DISPATCH_QUEUE_CONCURRENT);
方式二:dispatch_get_global_queue
……………………………………………………………………
串行队列:让任务一个接着一个的执行(也就是说必须等一个任务执行完毕后才可执行下一个任务)
方式一:dispatch_create_queue(“com.pi2e.com”,DISPATCH_QUEUE_SEARIAL/NULL)
方式二:dispatch_get_main_queue();
注意:主队列是GCD自带的一种特殊的串行队列,放置到主队列的任务,都会在主线程中执行
主要区别:任务的执行方式不同

猜你喜欢

转载自blog.csdn.net/ycf03211230/article/details/79565966
今日推荐