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,队列,串行,并行,同步,异步. ...
随机推荐
- nth_element 测试程序
/******************************************************************** created: 2014/04/29 11:35 file ...
- 去除inline-block元素间间距的N种方法
这篇文章发布于 2012年04月24日,星期二,22:38,归类于 css相关. 阅读 147771 次, 今日 52 次 by zhangxinxu from http://www.zhangxin ...
- 根据UIColor对象,获取对应的RGBA值
- (NSArray *)getRGBWithColor:(UIColor *)color { CGFloat red = 0.0; CGFloat green = 0.0; CGFloat blue ...
- Convert.ToInt32,int.Parse,int.TryParse,(int)的区别
1 (int)变量名[强制类型转换] 该转换方式主要用于数字类型转换,从int类型到long,float,double,decimal类型,可以使用隐式转换,但是从long类型到int类型就需要使用显 ...
- [Note] FrameFab Interesting Cut Results
onelayer search really smart, good result in short time
- Windows cmd命令搜索顺序
一.在cmd中执行一个不带后缀的命令(不带路径),首先会在无后缀的系统命令(如cd.dir等)中搜索,如果找到了就执行该命令, (dir是无后缀的系统命令所以优先执行,无视当前目录中的dir.exe) ...
- 【转载】SQL Server 2008 r2 中 SQL语句中单引号转义
sql server有两个转义符. 默认情况下, 单引号'是字符串的边界符, 如果在字符串中包含单引号', 则必须使用两个单引号', 第1个单引号'就是转义符.
- 海量数据相似度计算之simhash和海明距离
通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...
- iOS随机页面NSClassFromString
NSString *className = self.classNameArray[randomNumber]; Class viewClass = NSClassFromString(class ...
- 121. Best Time to Buy and Sell Stock (一) leetcode解题笔记
121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...