美文网首页
多线知识点总结

多线知识点总结

作者: 心跳节奏 | 来源:发表于2016-03-12 15:45 被阅读36次

这篇是我看了下面的文章然后做的知识点整理,附上文章地址:
关于iOS多线程,你看我就够了

多线程的技术种类

  1. Pthreads
  2. NSThread
  3. GCD
  4. NSOperation

Pthreads

基于C语言框架,一般不怎么用,用在类Unix操作系统中

NSThread

对Pthreads的封装,让其面向对象,相对来说更加方便,但需要程序员来对其生命周期进行管理,比较麻烦,一般不怎么用,用的多的是:

[NSThread CurrentThread]

GCD

苹果为多核运算提出的解决方案,其优点是自动会合理的使用CPU多核,并且线程的生命周期不需要程序员去管理。其有两个重要的概念:任务队列

任务

GCD中的block就是一个任务,任务的执行有分为两种:同步执行异步执行

同步执行:

阻塞当前线程,等block中的任务完成后再解除阻塞。

异步执行:

不阻塞当前线程,直接执行接下来的任务。

队列

队列存放着任务,队列分两种:串行队列并行队列

串行队列

GCD会一个一个地从串行队列中取出任务,当一个任务完成后,再去取另一个任务。

并行队列

GCD会从队列中取出任务,不等一个任务完成就会去取其他任务,把其他任务放到其他线程中。

创建队列

  1. 默认的主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

  2. 获取全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    其中,第一个参数为优先级,第二个参数为保留字段,填0即可。

  3. 自定义队列
    //自定义串行队列
    dispatch_queue_t custom1Queue = dispatch_queue_create("custom1", DISPATCH_QUEUE_SERIAL);
    //自定义并发队列
    dispatch_queue_t custom2Queue = dispatch_queue_create("custom2", DISPATCH_QUEUE_CONCURRENT);

队列组

可以把所有的队列加进一个队列组中,当队列组中所有的任务都完成时,队列组会发送一个消息。

  1. 创建队列组
    dispatch_group_t group = dispatch_group_create();
  2. 通知
    dispatch_group_notify(group, queue, ^{
    NSLog(@"完成-%@",[NSThread currentThread]);
    });

NSOperation与NSOperationQueue

苹果对GCD进行的封装,NSOperation表示任务,NSOperationQueue表示队列。

NSOperation

NSOperation是一个抽象类,有NSBlockOperation及NSInvocationOperation两种子类,用的多的是NSBlockOperation。

NSBlockOperation

  1. 创建任务
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@",[NSThread currentThread]);
    }];
    这个任务是放在当前线程中执行的。执行任务要加start方法开始执行任务。
  2. 添加任务
    NSBlockOperation有一个addExecutionBlock方法,可以在方法后面再增加方法
    [operation1 addExecutionBlock:^{
    for (int i = 0; i < 3; i++) {
    NSLog(@"1第%d次:%@",i,[NSThread currentThread]);
    }
    }];

后增加的任务是在其他线程中执行。

这里有个弊端了,会在当前线程和其他线程中执行任务,那我怎么样让它只在其他线程中执行任务呢?

NSOperationQueue

如果想让任务只在其他线程中执行,用这个。
Queue分两种,一种是主队列,一种是其他队列。

  1. 主队列
    NSOperationQueue *queue = [NSOperationQueue mainQueue];

  2. 其他队列
    NSOperationQueue *otherQueue = [[NSOperationQueue alloc]init];
    其他队列的任务会在其他线程中执行。任务执行起来是并行执行。那如果想让多个任务串行执行要怎么办呢?用maxConcurrentOperationCount来指定并发数量,如果数量为1,那么就是说过个任务串行执行。

  3. 添加依赖
    如果想任务A先执行,执行完A后再任务B,执行完B后再执行任务C,如果想达到这个目的,可以使用依赖。
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"下载图片-%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:3.0];
    }];

    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
       NSLog(@"加水印%@",[NSThread currentThread]);
       [NSThread sleepForTimeInterval:5.0];
    }];
    
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
       NSLog(@"上传图片:%@",[NSThread currentThread]);
    }];
    [operation2 addDependency:operation1];
    [operation3 addDependency:operation2];
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperations:@[operation1,operation2,operation3] waitUntilFinished:NO];
    

相关文章

网友评论

      本文标题:多线知识点总结

      本文链接:https://www.haomeiwen.com/subject/gorxlttx.html