IOS GDC线程原理及代码实现

核心概念

同步和异步的区别

 同步:在当前线程中执行

异步:在另一条线程中执行

GCD的队列可以分为2大类型

 并发队列(Concurrent Dispatch Queue)

可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)

并发功能只有在异步(dispatch_async)函数下才有效

串行队列(Serial Dispatch Queue)

让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

有4个术语比较容易混淆:同步、异步、并发、串行

 同步和异步决定了要不要开启新的线程

同步:在当前线程中执行任务,不具备开启新线程的能力

异步:在新的线程中执行任务,具备开启新线程的能力

并发和串行决定了任务的执行方式

 并发:多个任务并发(同时)执行

串行:一个任务执行完毕后,再执行下一个任务

核心概念:

任务:block

队列:把任务放到队列里面,队列先进先出的原则,

串行队列:顺序,一个一个执行(必须一个任务执行完了,才能从队列里面取出下一个任务)

并发队列:同时,同时执行很多个任务(可以同时取出很多个任务,只要有线程去执行)

同步sync:不会开新线程

异步async:会开新线程,多线程的代名词

串行队列同步执行:不开线程,在原来线程里面一个一个顺序执行

串行队列异步执行:开一条线程,在这个新线程里面一个一个顺序执行

并发队列异步执行:开多个线程,并发执行(不一定是一个一个)执行

并发队列同步执行:不开线程,在原来线程里面一个一个顺序执行

阶段性总结:

1.
开不开线程,由执行任务方法决定,同步不开线程,异步肯定开线程

2. 开多少线程,由队列决定,串行 最多 开一个线程, 并发可以开多个线程。 具体开多少个,有GCD底层决定,程序猿不能控制

队列的选择:

串行队列异步执行

-  开一条线程, 顺序执行

-  效率:不高,执行比较慢,资源占用小 -》 省电

一般网络是3G,对想能要求不会很高。

并发队列异步执行

- 开启多条线程,并发执行

- 效率:高,执行快,资源消耗大-》费电

使用场合:

- 网络WiFi,或者需要很快的响应,要求用户体验非常流畅。

-对任务执行顺序没有要求

-同步任务:一般只会在并发队列, 需要阻塞后续任务。必须等待同步任务执行完毕,再去执行其他任务。"依赖"关系


代码创建

- (void)gcdTest

{

//1. 并发队列 DISPATCH_QUEUE_CONCURRENT

//2. 串行队列

DISPATCH_QUEUE_SERIAL 
NULL

dispatch_queue_t
queue =
dispatch_queue_create("cz",

DISPATCH_QUEUE_CONCURRENT);

// 2. 异步执行任务

for (int i =
0; i <
10; i++) {

//

dispatch_async 
同步

dispatch_async(queue,
^{   // 异步

NSLog(@"%@
%d", [NSThread

currentThread], i);

});

}

}

主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程.

异步执行: 会开新线程,在新线程执行

结果: 不开线程, 只能在主线程上面,顺序执行!

- (void)gcdTest5

{

// 1. 获得主队列-> 程序启动,--> 至少有一个主线程-> 一开始就会创建主队列

dispatch_queue_t queue =
dispatch_get_main_queue();

// 2. 异步执行任务

for (int
i =
0; i <
10; i++) {

NSLog(@"调度前---");

// 异步:把任务放到主队列里,但是不需要马上执行

dispatch_async(queue, ^{

NSLog(@"%@
%d", [NSThread

currentThread], i);

});

NSLog(@"睡会");

[NSThread

sleepForTimeInterval:2.0];

}

NSLog(@"完成----");

如图:

主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程.

同步执行:要马上执行

结果:死锁

异步:把任务放到主队列里,但是不需要马上执行

dispatch_queue_t queue =
dispatch_get_main_queue();

dispatch_async(queue, ^{

NSLog(@"%@
%d", [NSThread

currentThread], i);

}

全局队列跟并发队列的区别

1. 全局队列没有名称 并发队列有名称

2. 全局队列,是供所有的应用程序共享。

3. 在MRC开发,并发队列,创建完了,需要释放。 全局队列不需要我们管理

第一个参数,一般 写 0(可以适配 iOS 7 & 8)

第二个  保留参数 : 0

dispatch_queue_t
queue =
dispatch_get_global_queue(0,

0);

for (
int i =

0 ;  i <

10 ; i++ ) {

dispatch_async(queue, ^{

NSLog(@"%@ %d",[NSThread

currentThread],i);

});

}

时间: 2024-10-17 14:07:27

IOS GDC线程原理及代码实现的相关文章

iOS 应用签名原理&amp;重签名

在苹果的日常开发中,真机测试与打包等很多流程都会牵扯到各种证书,CertificateSigningRequest,p12等.但是很多相应的开发者并不理解iOS App应用签名的原理和流程.今天着重讲解一下此内容. 思考 在苹果的iOS系统出来之前,以前的主流程Mac OS/Window软件存在着安全隐患,盗版软件,病毒入侵等,苹果希望能解决类似的问题,保证每一个安装在苹果手机上的app都是经过苹果官方允许的,怎么保证呢? 一.iOS 应用签名原理 1 代码签名 要想回答上面“思考”的答案,首先

iOS中多线程原理与runloop介绍

http://mobile.51cto.com/iphone-403490.htm iOS中多线程原理与runloop介绍 iPhone中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB.并且该值不能通过编译器开关或线程API函数来更改.只有主线程有直接修改UI的能力.……>>详细 兄弟专题:iOS人机交互指南之UI设计基础 1 iOS多线程编程知多少 在iOS的世界里有两种实现多线程的方式: 多线程是一个比较轻量级的方法来

flume原理及代码实现

转载标明出处:http://www.cnblogs.com/adealjason/p/6240122.html 最近想玩一下流计算,先看了flume的实现原理及源码 源码可以去apache 官网下载 下面整理下flume的原理及代码实现: flume是一个实时数据收集工具,hadoop的生态圈之一,主要用来在分布式环境下各服务器节点做数据收集,然后汇总到统一的数据存储平台,flume支持多种部署架构模式,单点agent部署,分层架构模式部署,如通过一个负载均衡agent将收集的数据分发到各个子a

iOS学习--UIScrollView 原理详解

iOS学习--UIScrollView 原理详解 http://blog.csdn.net/yanfangjin/article/details/7898189 ScrollView UIScrollView UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应.其中需要注意的子类是UITableView以及UITextView(用来显示大量的文字).

iOS界面布局之三——纯代码的autoLayout及布局动画

iOS界面布局之三--纯代码的autoLayout及布局动画 一.引言 关于界面布局,apple的策略已经趋于成熟,autolayout的优势在开发中也已经展现的淋漓尽致.除了使用storyBoard进行布局约束的拖拽,有时我们也需要在代码中进行autolayout的布局设置,Masonry库可以方便的创建约束属性,实际上,我们也没有必要再使用系统原生的代码来创建和设置约束,这篇博客只作为使用的方法备忘.前几篇布局介绍的链接如下: 使用autoresizing进行界面布局:http://my.o

IOS 多线程-线程基础知识

大部分现代操作系统,包括IOS,都支持执行线程的概念.每个进程可以包含多个线程,他们可以同时运行.如果只有一个处理器核心,操作系统将在所有执行线程之间切换,非常类似于在所有执行线程之间切换.如果拥有多个核心(核心),线程将像进程一样,分散到多个核心上去执行. 一个进程中的所有线程共享可执行程序代码和全局数据.每个线程也可以拥有一些独有的数据.线程可以使用一种成为互斥量或锁的特殊结构,这种结构可以确保特定的代码块无法一次没多个线程执行.在多个线程同时访问相同数据时,这有助于保证正确的结果,在一个线

HDFS集中式的缓存管理原理与代码剖析

转载自:http://www.infoq.com/cn/articles/hdfs-centralized-cache/ HDFS集中式的缓存管理原理与代码剖析 Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache management).这个功能对于提升Hadoop系统和上层应用的执行效率与实时性有很大帮助,本文从原理.架构和代码剖析三个角度来探讨这一功能. 主要解决了哪些问题 用户可以根据自己的逻辑指定一些经常被使用的数据或者高

Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

1. TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序) (1)Student.java: 1 package cn.itcast_07; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 thi

从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社

从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社 PPT链接: https://pan.baidu.com/s/1i5Jrr1N 视频链接: https://v.qq.com/x/page/n0386utnrb0.html?start=492