iOS 多线程的简单理解(3)执行方式 + 执行对列 的组合

通过对前面两偏线程理解的总结,自己对线程的理解也逐渐加深,梳理的清晰起来……

通常在使用线程 的时候,都是要用到 执行对列,执行方式,执行任务,

现在开始新一轮的深入

3. 1. 1  同步 + 串行

- (void)syncSerialQueue{

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

    NSLog(@" 同步 + 串行 start:::%@ ",[NSThread currentThread]);

    dispatch_sync(queue, ^{ // 添加任务 1
        for (int i = 0; i < 3; i++) {
            NSLog(@"同步 + 串行   index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    dispatch_sync(queue, ^{  // 添加任务 2
        for (int i = 10; i < 13; i++) {
            NSLog(@"同步 + 串行   index %d ::: %@",i,[NSThread currentThread]);
        }
    });
    NSLog(@"同步 + 串行  end :::%@",[NSThread currentThread]);
}

执行结果:::

2017-12-21 09:10:16.725075+0800 DeadThread[10455:3327379]  同步 + 串行 start:::<NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725222+0800 DeadThread[10455:3327379] 同步 + 串行   index 0 ::: <NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725339+0800 DeadThread[10455:3327379] 同步 + 串行   index 1 ::: <NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725530+0800 DeadThread[10455:3327379] 同步 + 串行   index 2 ::: <NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725615+0800 DeadThread[10455:3327379] 同步 + 串行   index 10 ::: <NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725765+0800 DeadThread[10455:3327379] 同步 + 串行   index 11 ::: <NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725821+0800 DeadThread[10455:3327379] 同步 + 串行   index 12 ::: <NSThread: 0x60800006b4c0>{number = 1, name = main}
2017-12-21 09:10:16.725870+0800 DeadThread[10455:3327379] 同步 + 串行  end :::<NSThread: 0x60800006b4c0>{number = 1, name = main}

总结结果:::

1.   同步 : 在当前线程执行,不开启新的线程,任务顺序执行

2.  串行 :添加的任务 顺序排列,顺序执行

图示::::

3.1.2  同步 +  并行

- (void)syncConcurrentQueue{

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

    NSLog(@"同步 + 并行 start:::%@ ",[NSThread currentThread]);

    dispatch_sync(queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@"同步 + 并行   index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    dispatch_sync(queue, ^{
        for (int i = 10; i < 13; i++) {
            NSLog(@"同步 + 并行  index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    NSLog(@"同步 + 并行  end :::%@",[NSThread currentThread]);
}

执行结果:::

2017-12-21 09:37:05.376797+0800 DeadThread[10595:3430843] 同步 + 并行 start:::<NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.376915+0800 DeadThread[10595:3430843] 同步 + 并行   index 0 ::: <NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.377000+0800 DeadThread[10595:3430843] 同步 + 并行   index 1 ::: <NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.377101+0800 DeadThread[10595:3430843] 同步 + 并行   index 2 ::: <NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.377262+0800 DeadThread[10595:3430843] 同步 + 并行  index 10 ::: <NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.377372+0800 DeadThread[10595:3430843] 同步 + 并行  index 11 ::: <NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.377440+0800 DeadThread[10595:3430843] 同步 + 并行  index 12 ::: <NSThread: 0x6040000759c0>{number = 1, name = main}
2017-12-21 09:37:05.377514+0800 DeadThread[10595:3430843] 同步 + 并行  end :::<NSThread: 0x6040000759c0>{number = 1, name = main}

总结结果:::

1.   同步 : 在当前线程执行,不开启新的线程,任务顺序执行

2.  并行 :添加的任务 不是顺序排列

图示::::

3.2.1 异步 + 串行

- (void)asyncSerialQueue{

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

    NSLog(@"异步 + 串行 start:::%@ ",[NSThread currentThread]);

    dispatch_async(queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@"异步 + 串行   index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    dispatch_async(queue, ^{
        for (int i = 10; i < 13; i++) {
            NSLog(@"异步 + 串行   index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    NSLog(@"异步 + 串行  end :::%@",[NSThread currentThread]);
}

执行结果::::

2017-12-21 09:43:04.903888+0800 DeadThread[10647:3468013] 异步 + 串行 start:::<NSThread: 0x60c0000654c0>{number = 1, name = main}
2017-12-21 09:43:04.904032+0800 DeadThread[10647:3468013] 异步 + 串行  end :::<NSThread: 0x60c0000654c0>{number = 1, name = main}
2017-12-21 09:43:04.904056+0800 DeadThread[10647:3468266] 异步 + 串行   index 0 ::: <NSThread: 0x604000074580>{number = 3, name = (null)}
2017-12-21 09:43:04.904127+0800 DeadThread[10647:3468266] 异步 + 串行   index 1 ::: <NSThread: 0x604000074580>{number = 3, name = (null)}
2017-12-21 09:43:04.904180+0800 DeadThread[10647:3468266] 异步 + 串行   index 2 ::: <NSThread: 0x604000074580>{number = 3, name = (null)}
2017-12-21 09:43:04.904370+0800 DeadThread[10647:3468266] 异步 + 串行   index 10 ::: <NSThread: 0x604000074580>{number = 3, name = (null)}
2017-12-21 09:43:04.904534+0800 DeadThread[10647:3468266] 异步 + 串行   index 11 ::: <NSThread: 0x604000074580>{number = 3, name = (null)}
2017-12-21 09:43:04.904603+0800 DeadThread[10647:3468266] 异步 + 串行   index 12 ::: <NSThread: 0x604000074580>{number = 3, name = (null)}

总结结果:::

1.异步: 开启新的线程,不影响当前线程;

2.串行: 添加 任务 顺序排列,顺序执行

3.2.2  异步 + 并行

- (void)asyncConcurrentQueue{

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

    NSLog(@"异步 + 并行 start:::%@ ",[NSThread currentThread]);

    dispatch_async(queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@"异步 + 并行   index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    dispatch_async(queue, ^{
        for (int i = 10; i < 13; i++) {
            NSLog(@"异步 + 并行  index %d ::: %@",i,[NSThread currentThread]);
        }
    });

    NSLog(@"同步 + 并行  end :::%@",[NSThread currentThread]);
}

执行结果:::

2017-12-21 09:50:40.207852+0800 DeadThread[10727:3517966] 异步 + 并行 start:::<NSThread: 0x60c00006d880>{number = 1, name = main}
2017-12-21 09:50:40.208038+0800 DeadThread[10727:3517966] 同步 + 并行  end :::<NSThread: 0x60c00006d880>{number = 1, name = main}
2017-12-21 09:50:40.208045+0800 DeadThread[10727:3518055] 异步 + 并行  index 10 ::: <NSThread: 0x60400006f3c0>{number = 3, name = (null)}
2017-12-21 09:50:40.208066+0800 DeadThread[10727:3518052] 异步 + 并行   index 0 ::: <NSThread: 0x600000075700>{number = 4, name = (null)}
2017-12-21 09:50:40.208139+0800 DeadThread[10727:3518055] 异步 + 并行  index 11 ::: <NSThread: 0x60400006f3c0>{number = 3, name = (null)}
2017-12-21 09:50:40.208197+0800 DeadThread[10727:3518052] 异步 + 并行   index 1 ::: <NSThread: 0x600000075700>{number = 4, name = (null)}
2017-12-21 09:50:40.208327+0800 DeadThread[10727:3518055] 异步 + 并行  index 12 ::: <NSThread: 0x60400006f3c0>{number = 3, name = (null)}
2017-12-21 09:50:40.208361+0800 DeadThread[10727:3518052] 异步 + 并行   index 2 ::: <NSThread: 0x600000075700>{number = 4, name = (null)}

总结结果::::

1.异步:开启线程能力;

2.并行:任务队列不顺序排列,同时执行;

3.开启线程的数量:取决于添加任务的数量

图示:::

时间: 2024-08-29 20:14:23

iOS 多线程的简单理解(3)执行方式 + 执行对列 的组合的相关文章

iOS runtime的简单理解

最近闲了下来,有时间了就研究一下runtime的运行机制,之前做开发的时候一直也没有特别关注这个东西,只是知道有,但是很少去刻意的使用,研究的不是很深,简单说一下吧,有错误的地方欢迎大家随时指正. Objective-C Runtime 是什么? Objective-C 的 Runtime 是一个运行时库(Runtime Library),它是一个主要使用 C 和汇编写的库,为 C 添加了面相对象的能力并创造了 Objective-C.这就是说它在类信息(Class information) 中

iOS多线程编程的几种方式

一.线程概述 有些程序是一条直线,起点到终点——如简单的hello world,运行打印完,它的生命周期便结束了,像昙花一现. 有些程序是一个圆,知道循环将它切断——像操作系统,一直运行,直到你关机. 一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流. Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程.主线程在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题. GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识. 在开始之前,需要理解是要提供给GCD队列的是代

IOS多线程_GCD的简单使用和详细说明

//你可以先看看这个例子的效果找点感觉,再看说明 @interface yxpGCDVController () { UIImageView *_imageView; } @end @implementation yxpGCDVController - (void)viewDidLoad { [super viewDidLoad]; self.title=@"GCD"; //初始化一_ImageView _imageView=[[UIImageView alloc] initWithF

iOS 多线程简单使用的详解

主线程 一个iOS程序运行后,默认会开启1条线程,称为"主线程"或"UI线程"(刷新UI界面最好在主线程中做,在子线程中可能会出现莫名其妙的BUG) 主线程的作用  显示\刷新UI界面 处理UI事件(比如点击事件.滚动事件.拖拽事件等) 注意点  别将比较耗时的操作放到主线程中 耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种"卡"的坏体验 iOS中多线程的实现方案  pthread(c语言,程序员管理) 一套通用的多线程API 适用于Un

iOS Grand Central Dispatch(GCD) 的简单理解

引言: GCD的全称是Grand Central Dispatch,是苹果在iOS4.0发布的一套处理并发运算方面的API.其用途是为了提高处理器多核运算的能力. GCD有点像NSOperationQueue,它们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行,但GCD比之NSOpertionQueue更底层更高效. GCD的工作原理: GCD的工作原理是让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务. 一个任务可以是一个函数(

iOS 中多线程的简单使用

iOS中常用的多线程操作有( NSThread, NSopretion CGD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loadImgFromURl{ NSURL *url=[NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&s

iOS多线程技术—多线程简单介绍

iOS多线程技术—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的

关于ios多线程GCD的简单介绍

很久没写博客了,实在太忙了,没有时间写.现在终于空闲下来了,今天就给大家介绍下ios开发里GCD的用法. 刚开始学习的新手,或许对多线程很迷茫,那么什么是线程呢?其实很简单,不要想那么复杂. 1.我们通常知道进程,就是正在执行中的程序,每个进程有自己独立的内存空间,进程之间互相不干涉.(就比如你打开微信) 2.什么是线程?线程是进程执行的基本单元.进程中的任务是在线程中执行的,进程在启动后会自动蜕化为主线程(ios UI Main thread),然后在执行任务. 3.线程的串航执行,比如我要下