iOS中的多线程NSThread/GCD/NSOperation & NSOperationQueue
iOS多线程有四套多线程方案:
- Pthreads
- NSThread
- GCD
- NSOperation & NSOperationQueue
接下来我来一个一个介绍他们
Pthreads
在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。
这套多线程是使用C语言实现的,所以可移植性很高。但是在实际项目中基本上不会用到,这里只做简单的介绍。
首先要包含头文件pthread.h
void *star(void *data)
{
    NSLog(@"%@",[NSThread currentThread]);
    return NULL;
}
- (IBAction)buttonTouch:(id)sender
{
    pthread_t thread;
    pthread_create(&thread, NULL, star, NULL);
}控制台输出:
2016-09-07 14:37:44.734 GCDDemo[2660:1124576] <NSThread: 0x7fd2024a58a0>{number = 2, name = (null)}
NSThread
NSThread是苹果封装的面向对象处理多线程的方案。但是他却不够智能,需要我们手动的管理线程的生命周期以及同步。所以这套方案我们通常也不常用。
创建线程:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(thisThread) object:nil];
[thread start];或者使用类方法
[NSThread detachNewThreadSelector:@selector(thisThread) toTarget:self withObject:nil];或者使用NSObject的类方法:
[self performSelector:@selector(thisThread)];但是NSThread需要使用NSLock来给线程上锁。以及进行其他操作,它不够智能。所以我们只在很少的情况使用它
GCD
GCD全称Grand Central Dispatch。是苹果提出的多核并行运算的解决方案。也就是说他会自动利用多核CPU,它会自动管理线程的生命周期。只需要我们告诉他应该做什么。
在GCD中有两个概念,一个是任务,一个是队列:
- 任务就是一串代码,在GCD中使用的Block。只需要将需要做的事情添加到Block里面就行了。任务有两种执行方式同步或者异步:
- 同步执行:会一直阻塞当前线程直到任务处理完。
- 异步执行:不会阻塞当前线程。当前线程会直接往下处理,直到该任务作出反应。
 
- 队列可以理解为用于存放任务的容器,队列分为串行队列和并行队列两种
- 串行队列:放在串行队列中的任务会遵循先入先出的原则,在当前线程中一个一个按顺序执行。
- 并行队列:放在并行队列中的任务虽然也会遵循先入先出的原则,但是会开不同的线程让他们同时执行。不过同时执行的数量也会受到系统资源的限制。
 
创建队列
- 主队列:主队列是一条串行队列,用于刷新UI。
dispatch_queue_t queue = dispatch_get_main_queue();
 NSLog(@"%@",queue);控制台输出 2016-09-08 14:15:25.361 GCDDemo[6984:2309204] <OS_dispatch_queue: com.apple.main-thread[0x10c34e9c0]> 
- 用户的队列:用户可以自己创建串行队列或者并行队列。
dispatch_queue_t queue = dispatch_queue_create("wodeduilie", NULL);
 NSLog(@"%@",queue);这个函数有两个参数,一个是队列名,第二个参数控制是否为串行或者并行。第二个参数传入DISPATCH_QUEUE_SERIAL或者NULL表示串行。DISPATCH_QUEUE_CONCURRENT表示并行。 创建任务
- 同步任务:会阻塞当前进程
dispatch_queue_t queue = dispatch_queue_create("wodeduilie", NULL);
 dispatch_sync(queue, ^{
 NSLog(@"%@",[NSThread currentThread]);
 });
- 异步任务:不会阻塞当前线程
dispatch_queue_t queue = dispatch_queue_create("wodeduilie", NULL);
 dispatch_async(queue, ^{
 NSLog(@"%@",[NSThread currentThread]);
 });
NSOperation & NSOperationQueue
NSOperation是面向对象的,它是对GCD的封装。NSOperation和 NSOperationQueue分别对应GCD的任务和队列
创建任务
NSOperation是抽象类,如果你想使用它需要使用它的子类:
- NSInvocationOperation通过绑定方法来封装任务:
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thisThread) object:nil];
 [operation start];
- NSBlockOperation通过Block来封装任务:
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
 NSLog(@"%@",[NSThread currentThread]);
 }];
 [operation start];NSBlockOperation中还有一个方法 addExecutionBlock:来添加多个任务,而且这些任务是并发执行的
控制台输出:
2016-09-08 22:21:26.660 GCDDemo[8112:2598032] <NSThread: 0x7fd151607d20>{number = 1, name = main}
你需要使用start方法或者cancel方法来开始或者取消一个任务。
创建队列
在NSOperationQueue中只有两种队列,一个是主队列,一个是自己创建的其他队列:
- 主队列就是我们用于刷新UI的: - NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
 NSLog(@"%@",[NSThread currentThread]);
 }];
 NSOperationQueue *queue = [NSOperationQueue mainQueue];
 [queue addOperation:operation];- 控制台输出: - 2016-09-08 22:36:33.053 GCDDemo[8279:2611844] <NSThread: 0x7f828b6020c0>{number = 1, name = main} 
- 其他队列就是用于我们进行耗时操作的队列: - NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
 NSLog(@"%@",[NSThread currentThread]);
 }];
 NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 [queue addOperation:operation];- 控制台输出: - 2016-09-08 22:40:49.459 GCDDemo[8405:2616956] <NSThread: 0x7f8833e2fd30>{number = 2, name = (null)} - 我们使用自定义的队列的时候,加入该队列的任务会自动的并发执行。但是有一个参数表示最大并发执行的数量maxConcurrentOperationCount。 
 当我们将这个参数设为1时就是串行队列。
 在NSOperationQueue中我们还可以直接使用方法添加任务- - (void)addOperationWithBlock:(void (^)(void))block;- 只要我们将任务添加到队列中就会自动执行任务的start方法。 
iOS中的多线程NSThread/GCD/NSOperation & NSOperationQueue的更多相关文章
- iOS中的多线程及GCD
		多线程中的一些概念 //任务:代码段 方法 线程就是执行这些任务 //NSThread类 创建线程 执行线程 [NSThread isMainThread]//判断是否是主线程 #import & ... 
- OS X 和iOS 中的多线程技术(下)
		OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ... 
- OS X 和iOS 中的多线程技术(上)
		OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ... 
- iOS多线程 NSThread/GCD/NSOperationQueue
		无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ... 
- iOS中的多线程 NSOperation
		在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ... 
- IOS中的多线程和NSRunLoop概述(转载)
		线程概述 有些程序是一条直线,从起点到终点,如Hello World,运行打印完,它的生命周期便结束了:有些程序是一个圆,不断循环,直到将它切断,如操作系统,一直运行直到你关机. 一个运行着的程序就 ... 
- iOS中实现多线程的技术方案
		pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { ... 
- iOS进阶之多线程--NSThread详解
		NSThread简介 NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期.在平时使用很少,最常用到的无非就是 [NSThread cu ... 
- iOS中的多线程基础
		NSThread NSThread是一个苹果封装过的,面向对象的线程对象.但是它的生命周期需要我们自己来手动管理,所以使用不是很常见,比如[NSThread currentThread],它可以获取当 ... 
随机推荐
- 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)
			被教练勒令做题不能看题解后的第一道新题,自行 yy 了好久终于 AC 了(菜啊)--写博客纪念. 题目: BZOJ1124 分析: 考虑每个人向他要打的人连边.根据题意,所有点都有且只有一条出边.那么 ... 
- 点击文字弹出一个DIV层窗口代码 【或FORM表单 并且获取点击按钮的ID值】
			点击不同按钮咨询不同的 专家 <?php for($i=1;$i<5;$i++){ $uid=$i; //用户ID ?> <a class="a_click" ... 
- 题解报告:hdu 1279 验证角谷猜想
			Problem Description 数论中有许多猜想尚未解决,其中有一个被称为“角谷猜想”的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数, ... 
- python--8、面向对象的深入知识
			面向对象的三大特性 上一篇我们讲的主要内容都符合面向对象的封装特性.那么问题来了?面向对象难道只有封装性么?当然不是,作为一个这么难理解的东西,要是只有封装性都对不起我们死了这么多脑细胞!所以,晴天霹 ... 
- PHP开发之旅-表单验证
			一.创建表单 <form name = "login" method = "post" action="contact.php?action=l ... 
- 简单TCP代码
			服务器: SOCKET s; s = ::socket(AF_INET,SOCK_STREAM,); sockaddr_in addr; addr.sin_family = AF_INET; addr ... 
- 04--Spring知识汇总
			1. @Autowried注解 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 se ... 
- CSS——样式初始化
			腾讯: body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0;p ... 
- easyui 使用笔记
			http://www.easyui.info/archives/1435.html datagrid 服务端分页 服务端分页,高效,快捷!强力推荐! easyui的datagrid服务端分页,通过设置 ... 
- 2016.01.22  前端学习 HTML/CSS
			学习HTML/CSS http://edu.51cto.com/course/course_id-3116.html 明日实践 
