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. viewDidUnload,viewDidLoad,viewWillAppear,viewWillDisappear的作用以及区别

    viewDidLoad:在视图加载后被调用 viewWillAppear:视图即将可见时调用.默认情况下不执行任何操作 viewDidAppear: 视图已完全过渡到屏幕上时调用 viewWillDi ...

  2. 【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List

    The task is reversing a list in range m to n(92) or a whole list(206). All in one : U need three poi ...

  3. 【转】Java 集合系列06之 Vector详细介绍(源码解析)和使用示例

    概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ...

  4. (转) 分布式文件存储FastDFS(一)初识FastDFS

    http://blog.csdn.net/xingjiarong/article/details/50559849 一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distribu ...

  5. SSL&TLS传输层加密协议实现图解--(重要)

    一.SSL&TLS 1.SSL:Secure Sockets Layer ,加密套接字协议层 1)SSL是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密 Secure ...

  6. Dynamics 365 CRM Connected Field Service 自动发送command

    上期降到了怎样部署connected field service(CFS) 我们假设现在IoT 设备是温度监控器, 当温度触发我们之前预设的温度值, IoT会通过IoT Hub 发送IoT Alert ...

  7. Map 键值对 set get delete

  8. 常见的Xshell运行命令

    最近接触到了Xshell这个软件,使用这个软件我们来进行连接Linux系统,进去之后我们可能会两眼一抹黑,小编就带大家来学些常见的shell命令. 首先我们要跟大家从最简单的聊起,我们进入Xshell ...

  9. 用 foreach()循环三维数组

    <?php $data = array( 0 => array( '中国' => 'china', '美国' => 'usa', '德国' => ' Germany', ...

  10. 新建python的虚拟环境

    1.mkvirutalenv --python=E:\Users\00\AppData\Local\Programs\Python\Python37-32\python.exe article_spi ...