一、多线程

进程:一个应用程序配套一个进程,进程会加载应用程序的资源,进程是放代码的,一个进程默认是一个线程(主线程),可以有多个线程

线程:执行代码的是线程,一个线程同时只能读取一段代码

栈里的变量是跟线程紧密相关的

比如有两个线程在栈里创建两个i,他们互不相干,两个i属于自己线程的。

一核跑多个线程就会互掐。

相关

cpu负责执行代码

线程负责读取代码并提供给cpu执行

抢cpu时间片

并发:多个线程同时执行,同一时间还是只有一个线程在执行

多核:cpu有多个可以用于计算的核,多核很有可能一个线程跑在一个核上,这样就互不影响了

为什么要多线程

堵塞线程

有很多原因能让线程堵塞

耗时操作:读文件、读网络文件、计时器

// 脱落出一个新的线程

[NSThreaddetachNewThreadSelector:@selector(run:) toTarget:selfwithObject:Nil];

同步/异步

同步:synchronize

异步:asynchronize

数据同步:

a有的,b也有,保持一致

同步:一行一行执行        单线程 顺序 无并发

异步:多个线程同时执行    多线程 乱序 有并发

并发下的数据访问

所有的局部变量都是跟线程相关

ios中的主线程是死循环

命令行的主线程执行完就return 0程序就结束了

所以要睡上一段时间,等子线程执行完

-(void)run{

[NSThreaddetachNewThreadSelector:@selector(run2:) toTarget:selfwithObject:Nil];

[NSThreaddetachNewThreadSelector:@selector(run2:) toTarget:selfwithObject:Nil];

[NSThread sleepForTimeInterval:10];

}

-(void)run2:(id)sender{

[selfloop];

}

-(void)loop{

while (self.count < 100) {

NSLog(@"%ld", self.count);

self.count++;

}

}

加锁机制

目的:让一段代码只能有一个线程执行,直到这个线程解锁后,才能让其他线程执行

如何使用?

NSCondition

lock

unlock

@synchronized(obj){//code}

obj任何对象都可以作为锁对象

一旦使用obj进入code以后,整个程序中任何地方使用@synchronized(obj2)

如果obj2如果是obj则进不去,否则进得去

二、执行队列

1 什么是执行队列?

执行队列是一个处理并发问题的一个全新的思考模式

它是管理线程的

2为什么要让执行队列管理线程?

因为创建线程和维护线程需要大量的资源

线程池?

一个专门用于存放创建好的线程的地方

3执行队列的机理

三、GCD 帮我们去管理队列

是什么?Grand Center Dispatch中央任务分发

提供了什么?

1)更简单的代码方式去处理OperationQueue

2)管理队列使用的

用于干嘛?

1)快速的将一行代码异步执行

子线程不能修改主线程界面上的东西,换句话说就是子线程不能改界面

所有更新界面的代码必须在主线程上执行,只有主线程才可以更新界面

怎么用?

1)获取默认级别的系统队列

2)把耗时操作扔进去

3)把更新界面操作扔回主队列(里面的主线程)执行

- (IBAction)tap:(id)sender {

NSString *path = @"http://images.apple.com/cn/imac/features/images/display_hero.jpg";

NSURL *url = [NSURLURLWithString:path];

// 系统写好的queue

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 异步执行

dispatch_async(queue, ^{

NSData *data = [NSDatadataWithContentsOfURL:url]; // 耗时操作

UIImage *image = [[UIImagealloc] initWithData:data];

// 主线程执行更新界面操作

dispatch_async(dispatch_get_main_queue(), ^{

self.imageview.image = image;

});

});

}

作业:

读取网络图片的tableview,不用堵塞主线程下载并更新cell上的图片

NSArray * data = @{

@"http:://image...."

@"http:://image...."

@"http:://image...."

};

12 - 多线程、执行队列、GCD的更多相关文章

  1. AJ学IOS(50)多线程网络之GCD简单介绍(任务,队列)

    AJ分享,必须精品 GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果 ...

  2. iOS多线程知识总结--GCD

    iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...

  3. iOS开发多线程篇 05 —GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  4. iOS 多线程学习笔记 —— GCD

    本文复制.参考自文章:iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http:// ...

  5. 多线程简介及GCD的使用

    多线程简介: 对于任意一个iOS应用,程序运行起来后,默认会产生一个主线程(MainThread),主线程专门用来处理UIKit对象的操作,如界面的显示与更新.处理用户事件触发的操作等等.(记忆这点, ...

  6. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  7. 多线程开发之三 GCD

    NSThread.NSOperation.GCD 总结: 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU 空闲时就会执行) 更新 UI 应该在 ...

  8. iOS多线程编程之GCD介绍(转载)

    一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提 ...

  9. 多线程:『GCD』详尽总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. ...

随机推荐

  1. 图像检索:一维直方图+EMD距离

    EMD距离具体介绍已经在在这里已经给出. 思路:我们把一张图像的归一化的一维直方图作为signature的权值,也就是一般在比較两幅图像颜色直方图的EMD距离时,每一行的坐标一样,仅仅是权重值不一样. ...

  2. sql 和 nosql 说明

    在传统的数据库中, 数据库的格式是由表(table).行(row).字段(field)组成的.表有固定的结构,规定了每行有哪些字段,在创建时被定义,之后修改很困难.行的格式是相同的,由若干个固定的字段 ...

  3. C#关键字列表

  4. C3P0连接池参数解释

    <!--acquireIncrement:链接用完了自动增量3个. --> <property name="acquireIncrement">3</ ...

  5. python切片练习

    这块儿没什么难的,细心一点就好 L = [] n = 1 while n <= 99: L.append(n) n = n + 2 print(L) #但是在Python中,代码不是越多越好,而 ...

  6. [C++参考]私有成员变量的理解

    私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了 ...

  7. 如何在Eclipse中配置Tomcat(免安装版)

    如何在Eclipse中配置Tomcat(免安装版) 2013-10-09 23:19wgelgrsh | 分类:JAVA相关 | 浏览642次 分享到:   2013-10-10 17:10提问者采纳 ...

  8. (C)高级排序法

    1.快速排序法 //方法1 从大到小 #include <iostream.h> void run(int* pData,int left,int right) { int i,j; in ...

  9. 设计模式总结5--命令模式 commend pattern

    命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象.就像我们去餐厅,点菜是找服务员,然后服务员去让厨师做菜而不是我们直接找厨师做菜 public interface Commend { ...

  10. 转:从pickle看python类成员的动态加载和类的定位

      pickle是Python轻便的对象序列化工具.使用pickle可以方便地把python对象写入文件对象中,或者像soap那样在socket间传送.     按照python的一贯作风,类的成员在 ...