Objective-C多线程详解(NSThread、NSOperation、GCD)

进程和线程

程序:一个由源代码生成的可执行应用(比如qq,微信…)

进程:进程是指在系统中正在运行的一个应用程序。一个正在运行的程序可以看成一个进程,进程负责去向手机系统申请资源,同时将这些资源调度给我们的线程

线程:1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程),可以看成是可以运行的代码段,这些代码段需要的资源,比如内存,都需要去向进程申请。线程是进 程的基本执行单元,一个进程(程序)的所有任务都在线程中执行。

单线程:只有一个现成的程序叫做单线程程序,如果是单线程则肯定是主线程。

多线程:拥有多个线程的程序叫做多线程程序,1个进程中可以开启条多线程每条线程可以并行(同时)执行不同的任务。比如同时开启3条线程分别下载3个文件,多线程技术可以提高程序的执行效率,但相对占用资源。其实多线程的原理仍是单线程,其实是CPU快速地在多条线程之间调度(切换),如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。

除了主线程之外的线程都是子线程,程序中只有一个主线程。主线程是顺序执行的,上一个任务执行完,才会执行下一个任务。子线程之间是并行执行的,也就是同时执行的。

注意: 我们规定我们的UI添加和刷新代码必须放在我们的主线程中去做

    [NSThread mainThread]; //获取到主线程
    [NSThread currentThread]; //获取到当前代码运行的线程

1,NSThread

NSThread适合轻量级多线程开发,控制线程顺序比较难,同时线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程)。

优点:NSThread相对比较轻量级
缺点:需要自己管理线程生命周期,线程同步,线程同步对数据加锁有一定的系统开销;

NSThread实现的三种方式:
1.

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadInitDoSomething) object:nil];

    [thread start];

这种方法需要手动开启线程。
2.

[NSThread detachNewThreadSelector:@selector(threadDetachDosomething) toTarget:self withObject:nil];

这种便利构造的方法,不需要手动开启。
3.

[self performSelectorInBackground:@selector(backGround) withObject:nil]; 

这种方式是NSObject对象自带的开启后台线程的方法。

2,NSOperation

优点:不需要手动关系线程,可以把精力放在自己要执行的操作上面,NSOperation是一个抽象类,不能被直接初始化,NSOperation我们一般使用它的子类NSInvocationOperation,NSBlockOperation或者继承NSOperation的自定义任务,我们经常将任务和队列NSOperationQueue进行搭配使用,一个对象一个任务,更利于任务的管理,还有一个优点在于可以明确的确定依赖关系。
缺点:他是一个OC对象,那么相对于C函数效率要低,而且基于GCD,那么GCD将提供比他更加全面的功能。
NSOperation使用:
1.

NSInvocationOperation *incocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationDoSomething) object:nil];
    [incocation start];

这种方式利用的Target-Action的设计模式,让响应者去执行任务。
2.

NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%d, %@", [NSThread isMainThread], [NSThread currentThread]);
    }];
    [block start];

这种方式利用OC里面经典的语法block(语法块)。但是和上者一样,如果单独使用NSOperation的子类对象必须手动的开启任务。
3.

//NSOperationQueue里面只有串行的时候线程优先级才是可行的
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //最大并发量,如果最大病发量为1时,那么队列里面的任务将串行,也就是执行完一个任务才能执行下一个,如果不为1,那就是并发进行。
    queue.maxConcurrentOperationCount = 1;

    //添加block块任务
    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"--0--%d, %@", [NSThread isMainThread], [NSThread currentThread]);
    }];
    //设置任务的优先级,只有队列为串行的时候优先级才能起到绝对的作用
    [block setQueuePriority:NSOperationQueuePriorityVeryHigh];
    NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"--1--%d, %@", [NSThread isMainThread], [NSThread currentThread]);
    }];
    [block1 setQueuePriority:NSOperationQueuePriorityNormal];
    NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"--2--%d, %@", [NSThread isMainThread], [NSThread cu
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值