12 - 多线程、执行队列、GCD
一、多线程
进程:一个应用程序配套一个进程,进程会加载应用程序的资源,进程是放代码的,一个进程默认是一个线程(主线程),可以有多个线程
线程:执行代码的是线程,一个线程同时只能读取一段代码
栈里的变量是跟线程紧密相关的
比如有两个线程在栈里创建两个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的更多相关文章
- AJ学IOS(50)多线程网络之GCD简单介绍(任务,队列)
AJ分享,必须精品 GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果 ...
- iOS多线程知识总结--GCD
iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...
- iOS开发多线程篇 05 —GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS 多线程学习笔记 —— GCD
本文复制.参考自文章:iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http:// ...
- 多线程简介及GCD的使用
多线程简介: 对于任意一个iOS应用,程序运行起来后,默认会产生一个主线程(MainThread),主线程专门用来处理UIKit对象的操作,如界面的显示与更新.处理用户事件触发的操作等等.(记忆这点, ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- 多线程开发之三 GCD
NSThread.NSOperation.GCD 总结: 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU 空闲时就会执行) 更新 UI 应该在 ...
- iOS多线程编程之GCD介绍(转载)
一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提 ...
- 多线程:『GCD』详尽总结
本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. ...
随机推荐
- Android开发之旅:android架构
本篇将站在顶级的高度——架构,来看android.我开篇就说了,这个系列适合0基础的人且我也是从0开始按照这个步骤来 学的,谈架构是不是有点螳臂挡车,自不量力呢?我觉得其实不然,如果一开始就对整个an ...
- poj2449 Remmarguts' Date【A*算法】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4303855.html ---by 墨染之樱花 [题目链接]:http://poj.org/ ...
- MYSQL大小写(由于数据由windows迁移到Linux导致)
今日从sqlserver上迁移了一个数据库到Linux的MySQL中,迁移成功了,但是应用却跑不通,查看日志发现,提示找不到表,我注意到,表名都是存在大小写的,而MySQL中的表名都是小写的.这提醒了 ...
- windows 2008 远程端口3389修改小记
修改远程端口使服务器更加安全,win2008上大致与win2003的配置差不多,有些细微的差别,在此小记一下. 简要步骤: 1.打开远程连接功能(默认都是已经打开的) :开始>计算机>属性 ...
- JQuery中Checkbox的一些功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- FreeCodeCamp:Confirm the Ending
要求: 检查一个字符串(str)是否以指定的字符串(target)结尾. 如果是,返回true;如果不是,返回false. 结果: confirmEnding("Bastian", ...
- FreeCodeCamp:Return Largest Numbers in Arrays
要求: 右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组. 提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素. 结果: l ...
- FreeCodeCamp:Title Case a Sentence
要求: 确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. 结果: titleCase("I'm a little tea pot") 应该 ...
- EBS动态创建账户组合实现
目的:使用程序动态创建账户组合.如果账户组合存在的话,返回存在的ID,不存在的话就动态创建账户组合并返回id. 实现步骤: 1. 得到账簿的CHART_OF_ACCOUNTS_ID 2. 得到账户弹性 ...
- python2.7_2.2_在套接字服务器上使用ForkingMixIn
Linux系统下才能用本程序.因为有Frok新的进程.... 代码如下: # -*- coding: utf-8 -*- import os import socket import threadin ...