美文网首页iOS 知识点原理
iOS中常见的线程-队列 与线程的关系

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

作者: 家振要翻天 | 来源:发表于2019-07-26 10:21 被阅读0次

大佬说我要学会总结,所以最近就会把之前项目中的情况,总结拓展下:

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

主队列

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

1 . 主队列异步任务

主队列中放入异步任务,不是马上执行,而是等到主队列中的其它所有除我们使用代码添加到主队列的任务都执行完毕之后,才会执行我们使用代码添加的任务。
例如

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

执行结果:

 ------------------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 . 串行队列执行同步任务

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

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的原则 以及 可能会造成的死锁等问题

相关文章

  • GCD

    GCD 队列与线程的关系 主队列和主线程 『ios』主线程 和 主队列的关系,绝对安全的UI操作,主线程中一定是主...

  • IOS多线程

    ios中常见的多线程方案: 多线程容易混淆的术语: 多线程各种队列的执行效果: Syn 往当前的串行队列中添加任务...

  • iOS 队列与线程

    队列和线程是在iOS开发中不可避免的,那么队列与线程有哪些关系呢? 给队列添加任务有四种方式:串行队列中执行同步任...

  • 进程、线程、多进程、多线程、任务、队列、NSThread、GCD

    推荐阅读:备战2020——iOS全新面试题总结 进程 线程 进程和线程的关系 多进程 多线程 任务 队列 iOS中...

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

    大佬说我要学会总结,所以最近就会把之前项目中的情况,总结拓展下: 在开发过程中经常用到队列和线程结合使用,给队列中...

  • iOS多线程开发—GCD(二)

    前言 在上一篇文章iOS多线程开发—GCD(二)中我介绍了什么是多线程,GCD与线程的关系,以及如何创建队列和简单...

  • 『ios』线程死锁还是队列死锁? 死锁测试

    之前 『ios』主线程 和 主队列的关系,绝对安全的UI操作,主线程中一定是主队列?在这片文章中,总结了下主线程和...

  • iOS 整理-线程篇

    什么是进程和线程进程和线程之间的关系什么是任务和队列多线程中同步异步,串行并行iOS中多线程的区别:NSThrea...

  • iOS底层-- 进程、线程、队列

    手动目录:基本概念进程线程任务队列相互之间的关联、区分、特点进程与线程的关系队列的特点线程与队列主线程和主队列多线...

  • 队列和线程

    [iOS多线程中,队列和执行的排列组合结果分析] 多线程中的队列有:串行队列,并发队列,全局队列,主队列。 执行的...

网友评论

    本文标题:iOS中常见的线程-队列 与线程的关系

    本文链接:https://www.haomeiwen.com/subject/ofpblctx.html