NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程
一、 进程、线程
进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间
线程:线程是进程中一个独立的执行路径(控制单元),一个进程中至少包含一条线程,即主线程(UI操作),可以将耗时的执行路径(如网络请求)放在其他线程中执行,线程不能被杀掉,但是可以暂停/休眠一条线程。
创建线程的目的:开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行
多线程的优势:充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入"并行运算"状态;将耗时的任务分配到其他线程执行,由主线程负责统一更新界面会使应用程序更加流畅,用户体验更好;当硬件处理器的数量增加,程序会运行更快,而程序无需做任何调整.。
弊端:新建线程会消耗内存空间和CPU时间,线程太多会降低系统的运行性能
二、 NSThread
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
[self performSelectorInBackground:@selector(test:) withObject:@"456"];
3、线程间通讯
回到主线程: [self performSelectorOnMainThread:@selector(testMain:) withObject:nil waitUntilDone:YES];// waitUntilDone是指是否等到主线程把方法执行完了,这个performSelector方法才返回。
在指定线程上执行操作:[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];
在本线程执行: [self performSelector:@selector(run) withObject:nil];
[NSThread sleepUntilDate:date];//以当前时间为标准,延迟到某个时间再执行该线程操作
7) 获取主线程: NSThread *main = [NSThread mainThread];
8) 获取当前线程: NSThread *current = [NSThread currentThread];
9) 结束线程:[NSThread exit];//当前线程方法中使用
[thread cancel];//主线程中使用
NSThread *thread;
BOOL _isEnd;//线程终止的标识
thread = [[NSThread alloc] initWithTarget:self selector:@selector(run1:) object:@"123"];
thread.name = @"123";//给线程起个名字
[NSThread detachNewThreadSelector:@selector(run2) toTarget:self withObject:nil];//隐式创建,不需要手动开启
NSLog(@"销毁");
//* [self performSelector:@selector(test) withObject:nil];//在当前线程执行另外一个方法
_isEnd = YES;//方法执行结束后将线程结束标识置为YES
NSLog(@"-----");
NSLog(@"主线程方法%@",[NSThread currentThread]);
三、 Cocoa NSOperation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。
NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:一种是用定义好的两个子类:NSInvocationOperation 和 NSBlockOperation,另一种是自定义子类继承NSOperation,实现内部相应的方法
1、 NSOperation的作用:配合使用NSOperation和NSOperationQueue也能实现多线程编程取消操作
2、 NSOperation和NSOperationQueue实现多线程的具体步骤:
先将需要执行的操作封装到一个NSOperation对象中
然后将NSOperation对象添加到NSOperationQueue中
系统会⾃动将NSOperationQueue中的NSOperation取出来
将取出的NSOperation封装的操作放到⼀条新线程中执⾏
NSLog(@"block操作:%@",[NSThread currentThread]);
NSLog(@"block操作2:%@",[NSThread currentThread]);
}];
[block addExecutionBlock:^{
NSLog(@"block操作3:%@",[NSThread currentThread]);
NSLog(@"block操作4:%@",[NSThread currentThread]);
-(void)run2{
NSLog(@"队列中执行:%@",[NSThread currentThread]);
[super viewDidLoad];
UIImageView *imageview = [[UIImageView alloc]initWithFrame:CGRectMake(10, 30, 100, 100)];
UIImage *image = [UIImage imageWithData:data];
//NSLog(@"---%@",image);
//返回主线程
dispatch_async(dispatch_get_main_queue(), ^{
//NSLog(@"更新UI:%@",[NSThread currentThread]);
imageview.image = image;
//创建组,用于存放耗时操作
//NSLog(@"==%@",image1);
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.downsc.com/vector_pic/shiliang_iecool/5/3/b_img/14430.jpg"]];
image2 = [UIImage imageWithData:data];
imageview.image = image;
imageview1.image = image1;
imageview2.image = image2;
imageview3.image = image3;
// Dispose of any resources that can be recreated.
NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程的更多相关文章
- GCD (Grand Central Dispatch) 笔记
GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...
- iOS开发-多线程之GCD(Grand Central Dispatch)
Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过 ...
- Multithreading annd Grand Central Dispatch on ios for Beginners Tutorial-多线程和GCD的入门教程
原文链接:Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial Have you ever written a ...
- Grand Central Dispatch (GCD)
Grand Central Dispatch (GCD) Reference Grand Central Dispatch (GCD) comprises language features, run ...
- IOS 多线程编程之Grand Central Dispatch(GCD)介绍和使用 多线程基础和练习
介绍:前面内容源自网络 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式 ...
- IOS学习之十七:Grand Central Dispatch(GCD)编程基础
IOS学习之十七:Grand Central Dispatch(GCD)编程基础 有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...
- [转] iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首 ...
- iOS 多线程编程之Grand Central Dispatch(GCD)
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其它的对称多处理系统的系统.这建立在任务并行运行的线程池模式的基础上的. 它 ...
- iOS开发之四张图说明GCD(Grand Central Dispatch)附Test源码
首先,先介绍几个概念:GCD,队列,串行,并行,同步,异步. ...
随机推荐
- SVN服务器与测试服务器代码同步
在本地做测试项目的时候,想svn提交和服务器上的代码一步到位,不想再手动更新一次了,所以就研究了下同步, 要实现svn提交后自动更新到测试服务器,在你的版本库下的hooks文件夹下添加post-com ...
- eclipse无法创建Server
报错:Cannot create a server using the selected type1.退出eclipse 2.到[工程目录下]/.metadata/.plugins/org.eclip ...
- three.js 根据png生成heightmap
Three.js: render real world terrain from heightmap using open data By jos.dirksen on Tue, 07/17/2012 ...
- discuz二次开发,分析和实现 之 向dz数据库插入自己的帖子吧
发个博客太麻烦了,难怪写博客的越来越少,吐一下,cnblogs的编辑器模板太丑! 最近开发社区 需要采集一些数据,使得模板输出有图文效果.就写了个简单的采集脚本,爬取目标站的内容,(用php 下载图片 ...
- C#时间戳转成php的time()
DateTime timeStamp = new DateTime(1970,1,1); //得到1970年的时间戳 long a = (DateTime.UtcNow.Ticks - timeSt ...
- 20145202、20145225、20145234 《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验
实验内容 1.配置环境 2.使用vi 编辑器阅读理解源码 2.编译应用程序 运行 make 产生可执行文件httpd 3.下载调试 使用 NFS 服务方式将HTTPD 下载到开发板上,并拷贝测试用的网 ...
- Python中的threading
Python中的threading RLock--重入锁 RLock在Python中的实现是对Lock的封装,具体在类中维护了一个重入次数的变量.一旦一个线程获得一个RLock,该线程再次要求获得该锁 ...
- WampServer3.0.4 允许外网访问配置教程
原文地址:http://jingyan.baidu.com/album/acf728fd556c93f8e410a344.html?picindex=1
- C语言的关键字,标示符以及数据类型
1. 关键字 1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doub ...
- javascript高级特性
01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...