美文网首页
iOS 关于多线程的理解

iOS 关于多线程的理解

作者: 福尔摩罗 | 来源:发表于2018-01-12 11:14 被阅读0次

一、多线程的基本概念理解
(1)进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,主要管理资源。

(2)线程:是进程的基本执行单元,一个进程对应多个线程。

(3)主线程:处理UI,所有更新UI的操作都必须在主线程上执行。不要把耗时操作放在主线程,会卡界面。

(4)多线程:在同一时刻,一个CPU只能处理1条线程,但CPU可以在多条线程之间快速的切换,只要切换的足够快,就造成了多线程一同执行的假象。

(5)线程就像火车的一节车厢,进程则是火车。车厢(线程)离开火车(进程)是无法跑动的,而火车(进程)至少有一节车厢(主线程)。多线程可以看做多个车厢,它的出现是为了提高效率。

(6)多线程是通过提高资源使用率来提高系统总体的效率。

(7)我们运用多线程的目的是:将耗时的操作放在后台执行!

二、多线程的四种解决方案分别是:pthread,NSThread,GCD, NSOperation。

三、这里主要介绍一下GCD 的使用
(1):GCD的特点

GCD会自动利用更多的CPU内核
GCD自动管理线程的生命周期(创建线程,调度任务,销毁线程等)
程序员只需要告诉 GCD 想要如何执行什么任务,不需要编写任何线程管理代码

(2)GCD的基本概念

任务(block):任务就是将要在线程中执行的代码,将这段代码用block封装好,然后将这个任务添加到指定的执行方式(同步执行和异步执行),等待CPU从队列中取出任务放到对应的线程中执行。
同步(sync):一个接着一个,前一个没有执行完,后面不能执行,不开线程。
异步(async):开启多个新线程,任务同一时间可以一起执行。异步是多线程的代名词
队列:装载线程任务的队形结构。(系统以先进先出的方式调度队列中的任务执行)。在GCD中有两种队列:串行队列和并发队列。
并发队列:线程可以同时一起进行执行。实际上是CPU在多条线程之间快速的切换。(并发功能只有在异步(dispatch_async)函数下才有效)
串行队列:线程只能依次有序的执行。
GCD总结:将任务(要在线程中执行的操作block)添加到队列(自己创建或使用全局并发队列),并且指定执行任务的方式(异步dispatch_async,同步dispatch_sync)

//串行队列

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

//并行队列
dispatch_queue_t queue1 = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

//主队列:
dispatch_get_global_queue(0, 0)

//主线程
dispatch_get_main_queue()

//同步执行任务
    dispatch_sync(dispatch_get_global_queue(0, 0), ^{
        // 任务放在这个block里
        NSLog(@"我是同步执行的任务"); 
    });

//异步执行任务
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 任务放在这个block里
        NSLog(@"我是异步执行的任务"); 
    });

//队列创建
//串行队列创建
dispatch_queue_t queue =dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);

// 同步执行
    dispatch_sync(queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@"串行同步1   %@",[NSThread currentThread]);
        }
    });

//栅栏

  dispatch_barrier_async(queue, ^{
        NSLog(@"------------barrier------------%@", [NSThread currentThread]);
        NSLog(@"******* 并发异步执行,在异步执行中加入一道分水岭,前面是先完成的,后面的 后完成 *********");
    });


//线程组

- (void)testGroup {
    dispatch_group_t group =  dispatch_group_create();
 
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"队列组:有一个耗时操作完成!");
    });
 
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"队列组:有一个耗时操作完成!");
    });
 
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"队列组:前面的耗时操作都完成了,回到主线程进行相关操作");
    });
}


通常情况下的 多线程 常规操作是 异步加载主队列任务,在主队列里面加载耗时操作,等结束后回到主线程刷新界面

 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // 耗时操作放在这里
      dispatch_async(dispatch_get_main_queue(), ^{
          // 回到主线程进行UI操作
      });
  });

相关文章

  • 多线程系列

    --------------------多线程-------------------- 你理解的多线程? iOS中...

  • OC-多线程GCD

    参考:GCD源码深入理解 GCDiOS多线程--彻底学会多线程之『GCD』关于iOS多线程,我说,你听,没准你就懂...

  • iOS复习之多线程

    关于iOS多线程,你看我就够了iOS多线程--彻底学会多线程使用dispatch_group来进行线程同步 iOS...

  • iOS 关于多线程的理解

    一、多线程的基本概念理解(1)进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统...

  • iOS进阶之多线程管理(GCD、RunLoop、pthread、

    深入理解RunLoopiOS多线程--彻底学会多线程之『GCD』iOS多线程--彻底学会多线程之『pthread、...

  • iOS 关于多线程(GCD)

    一、关于iOS多线程的一些简单操作 链接地址:多线程简介 二、iOS开发多线程篇—GCD的常见用法 主要为:延迟执...

  • 理解GCD

    (1)博客:深入理解GCD 理解iOS中的线程池 多线程理解 ?:(1)信号量--...

  • ios多线程使用

    多线程编程大家肯定不陌生,关于ios多线程的使用的相关技术文章太多,本篇文章也是主要参考部分文章来进行关于ios多...

  • ios多线程的使用

    多线程编程大家肯定不陌生,关于ios多线程的使用的相关技术文章太多,本篇文章也是主要参考部分文章来进行关于ios多...

  • 多线程

    关于iOS多线程 https://www.jianshu.com/p/0b0d9b1f1f19 iOS 多线程:『...

网友评论

      本文标题:iOS 关于多线程的理解

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