多线程:概述

一、iOS的多线程方案
二、NSThread的简单使用
三、NSOperation的简单使用


一、iOS的多线程方案


1、什么是线程、什么是多线程

我们编写的OC代码最终都会被编译成二进制代码供CPU执行,那么CPU在执行这些二进制代码时是从上往下一行一行执行的,当遇见if语句或for语句等控制语句时,CPU会偏离当前地址处的二进制代码去执行其它地址处的二进制代码,但执行完后又会返回来执行当前地址处的二进制代码,直到二进制代码执行完毕,这样从头到尾的一个二进制代码串就称为一个线程,而所谓开辟一个新线程就是指把某个二进制代码串与别的二进制代码串独立开来,成为CPU一个单独的调度单位,所以当程序中有多个这样独立的二进制代码串时,就是多线程。使用多线程可以保证程序的响应性能和执行效率,但开辟太多线程会占用大量内存和CPU资源,而且很容易出现数据竞争问题。

我们都知道一个CPU一次只能执行一个线程,那苹果是怎么实现多线程并发的呢?原来苹果会让CPU一会儿执行线程1,一会执行线程2,当线程之间的切换时间足够短时,就让我们感觉CPU是在一次执行多个线程。而现在设备都是多核的了,就不仅仅是“感觉”了,而是真得可以利用多核来实现多线程并发。

2、iOS的多线程方案

多线程方案 简介 语言 线程生命周期 使用频率
NSThread 是对pthread的OC封装,使用更加面向对象,轻量级、灵活 OC 手动管理 偶尔使用
GCD 充分利用设备的多核,旨在替代NSThread等多线程方案 C 自动管理 最常使用
NSOperation 是对GCD的OC封装,使用更加面向对象,并提供了添加任务依赖、控制任务执行状态等功能 OC 自动管理 有时使用


二、NSThread的简单使用


- (void)viewDidLoad {
    [super viewDidLoad];

    // 创建新线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
    // 启动新线程
    [thread start];
}

- (void)threadAction {
    
    // 任务...
}


三、NSOperation的简单使用


1、异步追加

GCD里有dispatch_syncdispatch_async之分,要想实现多线程开发就必须得用dispatch_asyncdispatch_sync使用不当还会造成死锁。

NSOperation里没有同步追加,只有异步追加,只要我们创建一个任务,把任务追加到队列里时就是异步追加。由此可见,NSOperation更加专注于多线程开发,也不会发生类似于GCD那样的死锁。

  • selector创建法创建一个任务
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
  • block创建法创建一个任务
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    
    // 任务...
}];
  • 把任务追加到队列中
[queue addOperation:operation];

2、并发队列和主队列

GCD里有串行队列、并行队列之分,如果想让多个任务并发执行,就必须得用并发队列,而如果想让多个任务串行执行,就必须得用串行队列。

NSOperation里没有串行队列(主队列除外),只有并发队列,只要我们创建一个队列,它就是并发队列。由此可见,NSOperation更加专注于多线程并发。

  • 并发队列
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  • 主队列
// 获取主队列
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];

3、示例

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    for (int i = 0; i < 10; i++) {
        
        // 创建任务
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
        // 把任务追加到队列中
        [queue addOperation:operation];
    }
}

- (void)threadAction {
    
    NSLog(@"执行任务,%@", [NSThread currentThread]);
}

@end


// 控制台打印:
执行任务,{number = 6, name = (null)}
执行任务,{number = 7, name = (null)}
执行任务,{number = 5, name = (null)}
执行任务,{number = 6, name = (null)}
执行任务,{number = 5, name = (null)}
执行任务,{number = 7, name = (null)}
执行任务,{number = 4, name = (null)}
执行任务,{number = 6, name = (null)}
执行任务,{number = 5, name = (null)}
执行任务,{number = 7, name = (null)}

你可能感兴趣的:(多线程:概述)