iOS中常见的线程-队列 与线程的关系

大佬说我要学会总结,因此最近就会把以前项目中的状况,总结拓展下:bash

在开发过程当中常常用到队列和线程结合使用,给队列中添加任务有四种使用方法:串行队列中执行同步任务、串行队列中执行异步任务、并发队列中执行同步任务、并发队列中执行异步任务,还有主队列,下面先说下主队列并发

##主队列异步

dispatch_get_main_queue() 常见的宏定义 解释: 主队列:专门负责调度主线程度的任务,没有办法开辟新的线程。因此,在主队列下的任务无论是异步任务仍是同步任务都不会开辟线程,任务只会在主线程顺序执行。async

1 . 主队列异步任务spa

主队列中放入异步任务,不是立刻执行,而是等到主队列中的其它全部除咱们使用代码添加到主队列的任务都执行完毕以后,才会执行咱们使用代码添加的任务。 例如线程

NSLog(@"------------------1");
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"主队列异步 %@",[NSThread currentThread]);
    });
    NSLog(@"------------------2");

复制代码

执行结果:code

------------------1
 ------------------2
主队列异步   <NSThread: 0x100e06230>{number = 1, name = main}
复制代码

2 . 主队列同步任务 容易阻塞主线程,由于代码任务须要立刻执行,可是主线程正在执行代码任务的方法体,所以代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,所以就造成了相互等待,形成了死锁队列

// 主队列同步
    NSLog(@"------------------1");
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"主队列同步 %@",[NSThread currentThread]);
    });
    NSLog(@"------------------2");

复制代码

二 . 串行队列开发

1 . 串行队列执行同步任务get

在主线程中依次执行任务,不会开启新线程

dispatch_queue_t queue =dispatch_queue_create("jz",DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }
    });
复制代码

执行结果是依次执行顺序内容

2 . 串行队列执行异步任务

在主线程以外新建一个线程,在新建的线程中依次执行任务

dispatch_queue_t queue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }
    });
复制代码

执行的结果依然是依次执行

三 . 并发队列

1 . 并发队列执行同步任务

主线程中依次执行任务,不会开启新线程

dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }
    });

复制代码

//并发队列 同步进行 依次打印线程

2 . 并发队列执行异步任务

三个任务同时执行

dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }

--------------------- 
复制代码

并发队列 异步进行 就发现线程已经不是同步顺序了,打印内容是 都在处理线程任务

在业务使用中,大部分使用的就是异步线程去执行相应的业务,因此使用的过程当中 日常注意FIFO的原则 以及 可能会形成的死锁等问题

相关文章
相关标签/搜索