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的封装。NSOperationNSOperationQueue分别对应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方法。

原文链接:http://www.jianshu.com/p/162ba1b0c495

iOS中的多线程NSThread/GCD/NSOperation & NSOperationQueue的更多相关文章

  1. iOS中的多线程及GCD

    多线程中的一些概念 //任务:代码段  方法  线程就是执行这些任务 //NSThread类 创建线程 执行线程 [NSThread isMainThread]//判断是否是主线程 #import & ...

  2. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  3. OS X 和iOS 中的多线程技术(上)

    OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...

  4. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  5. iOS中的多线程 NSOperation

    在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ...

  6. IOS中的多线程和NSRunLoop概述(转载)

    线程概述 有些程序是一条直线,从起点到终点,如Hello World,运行打印完,它的生命周期便结束了:有些程序是一个圆,不断循环,直到将它切断,如操作系统,一直运行直到你关机.  一个运行着的程序就 ...

  7. iOS中实现多线程的技术方案

    pthread 实现多线程操作 代码实现: void * run(void *param) {    for (NSInteger i = 0; i < 1000; i++) {         ...

  8. iOS进阶之多线程--NSThread详解

    NSThread简介 NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期.在平时使用很少,最常用到的无非就是 [NSThread cu ...

  9. iOS中的多线程基础

    NSThread NSThread是一个苹果封装过的,面向对象的线程对象.但是它的生命周期需要我们自己来手动管理,所以使用不是很常见,比如[NSThread currentThread],它可以获取当 ...

随机推荐

  1. 消息队列 (2) java实现简单的RabbtMQ

    假设有如下问题: 1.如果消费者连接中断,这期间我们应该怎么办? 2.如何做到负载均衡? 3.如何有效的将数据发送到相关的接收者?就是怎么样过滤 4.如何保证消费者收到完整正确的数据 5.如何让优先级 ...

  2. NSNotificationCenter 的使用详解

    通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,例如 View 加载完后会触发 viewDidLoad.Apple 还为我们提供了另一种通知响应方式,那就是 NSNotif ...

  3. linux使用mount命令挂载、umount命令取消挂载

    一.mount挂载目录方式: mount 挂载目录 磁盘目录 二.umout取消挂载目录方式: 1.umout 磁盘目录 2.umout 挂载目录 3.umout 磁盘目录 挂载目录 如下图

  4. Python语言之模块

    模块基本上就是一个包含了所有你定义的函数和变量的文件.它用处在于使你你能在别的程序中重用它提供的功能和服务. 1.模块的使用方法 模块的文件名必须以.py作为扩展名. 当我们需要使用某个模块时,我们需 ...

  5. css图片高清适配

    同一张图片,在普通屏显示正常,但高清屏出现模糊.原因是原来一个像素的点分成的四个像素的点进行了显示. 解决方案:在高清屏中把图片变成二倍图,前提是二倍的高清图已经存在. .icon{ backgrou ...

  6. rrdtool 实践

    rrdtool 实践 rrdtool 参数比较多,如果直接看文档,不知从何入手,直接从例子入手这样容易理解,模拟网卡流量 1. 创建数据库 rrdtool create Flow.rrd --star ...

  7. unable to get system library for the project

    当向eclipse导入项目实例后,项目上出现红叉的错误提示,在项目属性里的Java Build Path里发现了错误提示复选选项: unable to get system library for t ...

  8. mybatis 项目配置

    第一:environments MyBatis 支持多个环境,可以任意配置: 第二:transactionManager MyBatis 支持两种类型的事务管理器:JDBC 和 MANAGED(托管) ...

  9. P1002 过河卒 【递推、简单动规】

    题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒 ...

  10. 面向对象:classmethod、staticmethod、property

    一.classmethod(类方法).staticmethod(静态方法) 方法包括:普通方法.类方法和静态方法,三种方法在内存中都归属于类,区别在于调用方式不同. # 普通方法 由对象调用,至少一个 ...